2011-02-10 108 views
9

我正在使用包括Matlab繪製的數字到LaTeX中。我平時的工作流程如下:如何在Matlab圖中使用非ASCII字符(用於LaTeX doc)?

  1. 腳本在MATLAB中創建人物(S),
  2. 我調整我覺得需要在可視化圖形編輯器進行調整,
  3. 圖保存爲.FIG(用於未來的修改)和.eps(包括在LaTeX中),
  4. 我將.eps文件轉換爲.pdf,
  5. PDF文件在LaTeX源代碼中被引用。

的一點是:當我嘗試在軸標籤使用,傳說,標題等非ASCII字符,(準確的說:波蘭國家字符如「A」,「E」, 'ś','ć')在Matlab圖形編輯器中編碼很好,字符顯示正確。在輸出到.eps後,它們都是錯誤的(例如:「Głębokość」變成「G³êbokoœæ」)。

有沒有一種方法可以正確地做到這一點,無論是通過調整Matlab選項或改變我的工作流程?

注:我發現,出口png格式或其他非矢量格式正確處理字符編碼,但我想,以避免做 - 我要求的方式來「養它矢量「。直接導出到.pdf產生與.eps相同的效果,例如。它產生了錯誤的結果。

PS。 Matlab是R2008a,.latex文件是用pdfText,.eps文件和MikTeX 2.9(全部在Win7下)的epstopdf編譯的。

回答

8

你可以看看psfrag,這就是我在LaTeX中嘗試使用Matlab圖形時通常使用的。你基本上只是把標籤放在Matlab的圖中,然後用LaTeX文本替換這些標籤。最大的好處是可以讓你在文字和數字中擁有相同的符號。

編輯:當尋找psfrag-URL時,我找到了一個Matlab腳本來簡化它: LaPrint

+0

我以某種方式忽略了使用pdflatex的信息。對於不那麼醜陋的解決方法你有什麼想法嗎? – triazotan 2011-02-10 16:06:14

+0

Matlab可以直接在文本字段中解釋乳膠。您是否曾嘗試在matlab文本字段中放置像「\'c」這樣的膠乳構造,並將解釋器設置爲「latex」而不是直接輸入「ć」? – groovingandi 2011-02-10 18:05:49

4

另一種可能的解決方案是使用matlab2tikz。它會創建一個tikz/pgfplot源文件,該文件可能由您的膠乳源直接包含。這意味着它使用LaTeX的設施進行字體渲染。您可以直接編輯生成的文件來調整標籤等。不幸的是,它不適用於所有的MATLAB數字。

1
char(2048) will be shown by `print -depsc` as 'à ', 
char(5064) as 'á', 
char(28808) as 'ç', 
char(37000) as 'é', 
char(32904) as 'è', ... 

對於latin1的字符集的其他字符,看:

for j=0:4*64;clf;subplot(1,1,1);plot(eye(2));leg='';for i=4*(j+1)-1:-1:max(1,4*j); 
str=['  ',num2str(i*64)];leg(i,:)=[str(end-4:end),':',char(64*i+(0:63))]; 
end; 
title(leg,'interpreter','none');print('-depsc',['ascii',num2str(j),'.ps']); 
end; 

我使用pdflatex,所以psfrag是不是一種選擇,並pdfrack似乎被打破。

0

對於用非ASCII ISO-8859-1字符導出Matlab圖形,在Windows上沒有問題,但在具有UTF-8語言環境的Linux上有Matlab錯誤和workaround。這裏的問題針對的是不在ISO-8859-1中的字符,這更加棘手。以下是我發佈在相關question上的解決方案。

如果需要的字符數小於256(8位格式),理想地在標準的編碼集,那麼一種解決方案是:

  1. 轉換八進制代碼到Unicode字符;
  2. 將文件保存到目標編碼標準(以8位格式);
  3. 添加目標編碼集的編碼矢量。

例如,如果要導出波蘭語文本,則需要將該文件轉換爲ISO-8859-2。以下是Python(多平臺)的實現:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import sys,codecs 
input = sys.argv[1] 
fo = codecs.open(input[:-4]+'_latin2.eps','w','latin2') 
with codecs.open(input,'r','string_escape') as fi: 
    data = fi.readlines() 
with open('ISOLatin2Encoding.ps') as fenc: 
    for line in data: 
     fo.write(line.decode('utf-8').replace('ISOLatin1Encoding','MyEncoding')) 
     if line.startswith('%%EndPageSetup'): 
      fo.write(fenc.read()) 
fo.close() 

另存爲eps_lat2.py;然後運行命令python eps_lat2.py file.eps,其中file.eps是由Matlab創建的eps,使用Latin-2編碼創建file_latin2.eps。該文件ISOLatin2Encoding.ps包含encoding vector

/MyEncoding 
% The first 144 entries are the same as the ISO Latin-1 encoding. 
ISOLatin1Encoding 0 144 getinterval aload pop 
% \22x 
    /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 
    /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 
% \24x 
    /nbspace /Aogonek /breve /Lslash /currency /Lcaron /Sacute /section 
    /dieresis /Scaron /Scedilla /Tcaron /Zacute /hyphen /Zcaron /Zdotaccent 
    /degree /aogonek /ogonek /lslash /acute /lcaron /sacute /caron 
    /cedilla /scaron /scedilla /tcaron /zacute /hungarumlaut /zcaron /zdotaccent 
% \30x 
    /Racute /Aacute /Acircumflex /Abreve /Adieresis /Lacute /Cacute /Ccedilla 
    /Ccaron /Eacute /Eogonek /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron 
    /Dcroat /Nacute /Ncaron /Oacute /Ocircumflex /Ohungarumlaut /Odieresis /multiply 
    /Rcaron /Uring /Uacute /Uhungarumlaut /Udieresis /Yacute /Tcedilla /germandbls 
% \34x 
    /racute /aacute /acircumflex /abreve /adieresis /lacute /cacute /ccedilla 
    /ccaron /eacute /eogonek /edieresis /ecaron /iacute /icircumflex /dcaron 
    /dcroat /nacute /ncaron /oacute /ocircumflex /ohungarumlaut /odieresis /divide 
    /rcaron /uring /uacute /uhungarumlaut /udieresis /yacute /tcedilla /dotaccent 
256 packedarray def 

這裏是在Linux上另一種實現方式使用bash:

#!/bin/bash 
name=$(basename "$1" .eps) 
ascii2uni -a K "$1" > /tmp/eps_uni.eps 
iconv -t ISO-8859-2 /tmp/eps_uni.eps -o "$name"_latin2.eps 
sed -i -e '/%EndPageSetup/ r ISOLatin2Encoding.ps' -e 's/ISOLatin1Encoding/MyEncoding/' "$name"_latin2.eps 

保存爲eps_lat2;然後運行命令sh eps_lat2 file.eps創建帶有Latin-2編碼的file_latin2.eps。

通過更改腳本中的編碼矢量和iconv(或codecs.open)參數,可以輕鬆地將其適用於其他8位編碼標準。

相關問題