2011-02-10 13 views
9

Estoy usando incluir figuras de Matlab en LaTeX. Mi flujo de trabajo habitual es el siguiente:Cómo usar caracteres que no sean ASCII en las figuras de Matlab (para usar en LaTeX doc)?

  1. escritura en Matlab crea la figura (s),
  2. I tweak lo que encuentro necesidades que ser ajustado en el editor gráfico visual,
  3. figura se guarda como .fig (por futura modificación) y .eps (para incluir en LaTeX),
  4. Convierto archivos .eps a .pdf,
  5. Los archivos PDF están referenciados en el código fuente LaTeX.

Hasta el punto: cuando intento utilizar en etiquetas de los ejes, la leyenda, títulos, etc. caracteres no ASCII, (para ser exactos: caracteres nacionales polacas por ejemplo 'A', 'E', La codificación 'ś', 'ć') en el editor de figuras Matlab está bien y los caracteres se muestran correctamente. Después de exportar a .eps, todos están equivocados (ejemplo: "Głębokość" se convierte en "G³êbokoœæ").

¿Existe alguna manera de hacer esto correctamente, ya sea ajustando las opciones de Matlab o cambiando mi flujo de trabajo?

Nota: He encontrado que la exportación a otros .png o no vectorial formatos de codificación de caracteres maneja adecuadamente, pero me gustaría evitar tener que hacer que - Estoy pidiendo una manera de "mantener es vector ". Exportar directamente a .pdf produce el mismo efecto que .eps, p. Ej. está produciendo resultados incorrectos.

PS. Matlab es R2008a, los archivos .latex se compilan con pdflatex, archivos .eps con epstopdf de MikTeX 2.9 (todos bajo Win7).

Respuesta

8

Podrías echar un vistazo a psfrag, eso es lo que suelo usar cuando trato de usar figuras de Matlab en LaTeX. Básicamente colocas solo etiquetas en la figura en Matlab y luego las reemplazas con texto LaTeX. El mayor beneficio es que esto le permite tener símbolos idénticos en texto y figuras.

Editar: cuando busco la URL de psfrag, encuentro una secuencia de comandos de Matlab para simplificar esto: LaPrint.

+0

De alguna manera omite información que utilizo pdflatex. ¿Tiene alguna idea para una solución no tan fea? – triazotan

+0

Matlab puede interpretar látex directamente en los campos de texto. ¿Has intentado poner la construcción de látex como "\" c "en el campo de texto de matlab y configurar el intérprete para" látex "en lugar de ingresar" ć "directamente? – groovingandi

+0

Sí, tengo. Ejemplo que dio trabajo, pero es la única solución para tres acentos polacos: acento agudo (\ '), punto sobre letra (\.) Y L con golpe (\ L). Ogonek (es decir, el signo diacrítico encontrado en '±' o 'e') se denota por \ k {} y Matlab no lo interpreta correctamente. Una solución para esto es usar cedilla (\ c {}), pero no es exactamente igual y se ve un poco extraño. – triazotan

4

Otra posible solución sería usar matlab2tikz. Crea un archivo fuente tikz/pgfplot que puede ser incluido directamente por su fuente de látex. Esto significa que utiliza las instalaciones de LaTeX para la representación de fuentes. Puede editar directamente el archivo generado para modificar las etiquetas y cosas por el estilo. Desafortunadamente, no funciona para todas las figuras de MATLAB.

+0

Gracias, serán útiles para simples higos/documentos. – triazotan

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

Para otros personajes de juego de caracteres latin1, Mira:

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; 

estoy usando pdflatex, por lo psfrag no es una opción, y pdfrack parece no estar funcionando.

0

Para exportar una figura de Matlab con caracteres que no sean ASCII ISO-8859-1, no hay ningún problema en Windows, pero en Linux con una configuración regional UTF-8 hay un error de Matlab y workaround. La pregunta aquí apunta a los personajes que no están en ISO-8859-1, que es más complicado. Aquí hay una solución que publiqué en un relacionado question.

Si el número de caracteres necesarios es menor de 256 (formato de 8 bits) e idealmente en un conjunto estándar de codificación, a continuación, una solución consiste en:

  1. Convertir el código octal en el carácter Unicode;
  2. Guarde el archivo en el estándar de codificación de destino (en un formato de 8 bits);
  3. Agregue el vector de codificación para el conjunto de codificación de destino.

Por ejemplo, si desea exportar texto en polaco, debe convertir el archivo en ISO-8859-2. Aquí hay una implementación con Python (multiplataforma):

#!/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() 

guardado como eps_lat2.py; luego ejecuta el comando python eps_lat2.py file.eps, donde file.eps es el eps creado por Matlab, crea file_latin2.eps con codificación Latin-2. Los ISOLatin2Encoding.ps archivo contiene la 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 

Aquí es otra implementación en Linux con 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 

guardan como eps_lat2; luego, al ejecutar el comando sh eps_lat2 file.eps se crea file_latin2.eps con codificación Latin-2.

Se puede adaptar fácilmente a otros estándares de codificación de 8 bits cambiando el vector de codificación y el parámetro iconv (o codecs.open) en el script.

Cuestiones relacionadas