Domanda

Sto cercando un modo per sostituire una sottostringa su una stringa in LaTeX.Quello che mi piacerebbe fare è creare un comando che posso chiamare in questo modo:

\replace{File,New}

e questo genererebbe qualcosa di simile

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

Questo è un esempio semplice, ma mi piacerebbe poter inserire la formattazione/struttura in un singolo comando anziché ovunque nel documento.So che potrei creare diversi comandi che accettano un numero crescente di parametri, ma spero che esista un modo più semplice.

Modifica per chiarimenti

Sto cercando un equivalente di

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

qualcosa che può prendere una stringa arbitraria e sostituire una sottostringa con un'altra sottostringa.

Quindi potrei chiamare il comando con eplace{File}, eplace{File,New}, eplace{File,Options,User}, ecc., racchiudere le parole in grassetto e sostituire eventuali virgole con il comando freccia destra .Anche se la parte "racchiudere in grassetto" è troppo difficile (come penso potrebbe essere), solo la parte di sostituzione sarebbe utile.

È stato utile?

Soluzione

Il caso generale è piuttosto più complicato (quando non si utilizzano le virgole come separatori), ma l'esempio che hai fornito può essere codificato senza troppi problemi con una certa conoscenza degli interni di 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}

Altri suggerimenti

sembra che il tuo problema con gli "spazi" derivi da un bug in quel pacchetto.Se racchiudi la macro "\GetTokens" tra, ad esempio, virgole, vedrai che lo spazio extra viene inserito da quella macro.

Sì, ci sono bug nel pacchetto tokenizer.Come ho detto sul mio blog, la correzione del bug consiste nell'utilizzare il seguente codice di correzione invece del semplice "\usepackage[trim]{tokenizer}":

\usepackage[trim]{tokenizer}  

\def\SH@GetTokens#1,#2\@empty{%
    \def\SH@token{#1}%
    \ifx\SH@trimtokens\SH@true% strip spaces if requested
        \TrimSpaces\SH@token%
    \fi%
    \SH@DefineCommand{\SH@FirstArgName}{\SH@token}%
    \SH@DefineCommand{\SH@SecondArgName}{#2}%
    }
\def\SH@CheckTokenSep#1,#2\@empty{%
    \def\SH@CTSArgTwo{#2}%
    \ifx\SH@CTSArgTwo\@empty%
        \edef\SH@TokenValid{\SH@false}%
    \else%
        \edef\SH@TokenValid{\SH@true}%
    \fi%
    }

Segnalerò questo bugfix allo sviluppatore Sascha Herpers

C'è un pacchetto LaTeX chiamato tokenizzatore che potrebbe aiutarti a fare quello che vuoi.

Ecco un hack (ma puro LaTeX, senza componenti interni) che si avvicina a ciò che penso tu voglia, ma con alcuni spazi estranei che non sono riuscito a risolvere.Forse Will Robertson può consigliare ulteriormente?A differenza della sua risposta leggermente più raffinata, non ho parametrizzato i frammenti, ecco qui:

\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}\\  

Prova il xstring pacchetto:

\usepackage{xstring}

[…]

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

OK, ritiro questa risposta.Grazie per aver chiarito la domanda.


Sospetto che questo potrebbe non essere quello che vuoi, ma eccolo comunque:

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

Se non è questo ciò che stai cercando, potresti chiarire la domanda, per favore?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top