2008-09-18 48 views
9

Estoy buscando una manera de hacer una sustitución de subcadena en una cadena en LaTeX. Lo que me gustaría hacer es construir un comando que puedo llamar así:Reemplazar un carácter con una cadena en LaTeX

\replace{File,New} 

y que genere algo así como

\textbf{File}$\rightarrow$\textbf{New} 

Este es un ejemplo sencillo, pero me gustaría ser capaz de poner formato/estructura en un solo comando en lugar de en cualquier parte del documento. Sé que podría construir varios comandos que requieren cada vez más parámetros, pero espero que haya una manera más fácil.

Editar una aclaración

estoy buscando un equivalente de

string.replace(",", "$\rightarrow$) 

algo que puede tomar una cadena arbitraria, y reemplazar una subcadena con otra subcadena.

Para poder llamar al comando con \ replace {File}, \ replace {File, New}, \ replace {File, Options, User}, etc., ajuste las palabras con negrita y reemplace cualquier comas con el comando de flecha derecha. Incluso si el bit "envolviendo con negrita" es demasiado difícil (como creo que podría ser), solo la parte de reemplazo sería útil.

Respuesta

6

El caso general es bastante más complicado (cuando no se está utilizando comas como separadores), pero el ejemplo que dio se puede codificar sin demasiados problemas con algún conocimiento de las partes internas de LaTeX.

\documentclass[12pt]{article} 
\makeatletter 
\newcommand\formatnice[1]{% 
    \let\@formatsep\@formatsepinit 
    \@for\@ii:=#1\do{% 
    \@formatsep 
    \formatentry{\@ii}% 
    }% 
} 
\def\@formatsepinit{\let\@formatsep\formatsep} 
\makeatother 
\newcommand\formatsep{,} 
\newcommand\formatentry[1]{#1} 
\begin{document} 
\formatnice{abc,def} 

\renewcommand\formatsep{\,$\rightarrow$\,} 
\renewcommand\formatentry[1]{\textbf{#1}} 
\formatnice{abc,def} 
\end{document} 
+0

He votado esto - es mejor que el mío, cuyo único mérito real es que es pura LaTeX –

+0

Esto funcionó muy bien, ¡gracias! –

-1

OK, retiro esta respuesta. Gracias por aclarar la pregunta.


Sospecho que esto no puede ser lo que quiera, pero aquí va de todos modos:

\newcommand{\replace}[2]{\textbf{#1}$\rightarrow$\textbf{#2}} 
\replace{File}{New} 

Si esto no es lo que está buscando, ¿podría aclarar la cuestión, por favor?

2

Hay un paquete LaTeX llamado tokenizer que puede ayudarlo a hacer lo que desee.

Aquí hay un hack (pero LaTeX puro, sin elementos internos) que se acerca a lo que yo creo que quiere, pero con algunos espacios extraños que no he sido capaz de solucionar. Tal vez Will Robertson puede aconsejar más? A diferencia de su respuesta un poco más pulido, no he parametrizado las partes y piezas, Aquí va:

\usepackage{forloop} 
\usepackage[trim]{tokenizer} 
... 
\newcounter{rrCount} 
\newcommand{\replace}[1]{% 
    \GetTokens{rrFirst}{rrRest}{#1,}% 
    \textbf{\rrFirst}% 
    \forloop{rrCount}{0}{\value{rrCount} < 100}{% 
     \ifthenelse{\equal{\rrRest}{}}{% 
      \setcounter{rrCount}{101}% 
     }{% 
      \GetTokens{rrFirst}{rrRest}{\rrRest}% 
      $\rightarrow$\textbf{\rrFirst}% 
     }% 
    }% 
}% 
% ----------------------------------------------------------------- 
\replace{a1}\\ 
\replace{a2,b2}\\ 
\replace{a3,b3,c3}\\ 
+0

Hmmm . No he usado el paquete tokenizer antes; parece que tu problema de "espacios" proviene de un error en ese paquete. Si rodea la macro "\ GetTokens" con, por ejemplo, comas, verá que la macro inserta el espacio extra. Por lo tanto, no es tu culpa :) –

+0

Sí, pensé que sí. Intenté agregar algunos '%' aleatorios en eol en la macro, pero fue en vano. –

2

Prueba el xstring package:

\usepackage{xstring} 

[…] 

\StrSubstitute{File,New}{,}{\(\rightarrow\)} 
+0

El enlace está roto, intente http://www.ctan.org/pkg/xstring –

4

parece que su problema "espacios" es de un error en ese paquete. Si rodea la macro "\ GetTokens" con, por ejemplo, comas, verá que la macro inserta el espacio extra.

Sí, hay errores en el paquete tokenizer.Como dije en mi blog, la corrección de errores es utilizar el siguiente código corregir en lugar de sólo "\ usepackage [ajuste] {tokenizer}":

\usepackage[trim]{tokenizer} 

\def\[email protected]#1,#2\@empty{% 
    \def\[email protected]{#1}% 
    \ifx\[email protected]\[email protected]% strip spaces if requested 
     \TrimSpaces\[email protected]% 
    \fi% 
    \[email protected]{\[email protected]}{\[email protected]}% 
    \[email protected]{\[email protected]}{#2}% 
    } 
\def\[email protected]#1,#2\@empty{% 
    \def\[email protected]{#2}% 
    \ifx\[email protected]\@empty% 
     \edef\[email protected]{\[email protected]false}% 
    \else% 
     \edef\[email protected]{\[email protected]}% 
    \fi% 
    } 

Reportaré esta corrección de errores a los desarrolladores Sascha Herpers

Cuestiones relacionadas