Pergunta

Eu estou procurando uma maneira de fazer uma substring substituir em uma corda em LaTeX. O que eu gostaria de fazer é construir um comando que eu posso chamar assim:

\replace{File,New}

e que geraria algo como

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

Este é um exemplo simples, mas eu gostaria de ser capaz de colocar a formatação / estrutura em um único comando, em vez de em todo o documento. Eu sei que eu poderia construir vários comandos que levam números de parâmetros aumentando, mas eu estou esperando que existe uma maneira mais fácil.

Editar para esclarecimento

Eu estou procurando o equivalente a

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

algo que pode tomar uma seqüência arbitrária, e substituir uma substring com outra substring.

Então, eu poderia chamar o comando com \ substituir {Arquivo}, \ substituir {Arquivo, Novo}, \ substituir {Arquivo, Opções, usuário}, etc., envolva as palavras com formatação em negrito, e substituir qualquer vírgulas com o comando seta para a direita. Mesmo que o "embrulho com negrito" bit é muito difícil (como eu acho que pode ser), apenas a substituir parte seria útil.

Foi útil?

Solução

O caso geral é um pouco mais complicado (quando você não estiver usando vírgulas como separadores), mas o exemplo que você deu podem ser codificados sem muita dificuldade com algum conhecimento dos internos látex.

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

Outras dicas

parece que o seu "espaços" problema é a partir de um bug no pacote. Se você colocar a macro "\ GetTokens" com, digamos, vírgulas, então você vai ver que o espaço extra é inserido por essa macro.

Sim, existem bugs no pacote de tokenizer. Como eu disse no meu blogue , o bugfix é usar o código a seguir corrigir em vez de apenas "\ usepackage [guarnição] {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%
    }

Vou relatar esta bugfix para o desenvolvedor Sascha Herpers

Há um pacote LaTeX chamada tokenizer que pode ajudá-lo a fazer o que quiser.

Aqui está um hack (mas látex puro, há internos), que fica perto do que eu acho que você quer, mas com alguns espaços estranhos Eu não tenho bastante sido capaz de correção. Talvez Will Robertson pode aconselhar ainda mais? Ao contrário de sua resposta um pouco mais polido, eu não parametrizados os pedaços, Aqui vai:

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

Tente o xstring pacote :

\usepackage{xstring}

[…]

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

OK, eu retirar esta resposta. Obrigado por esclarecer a questão.


Eu suspeito que isso pode não ser o que quiser, mas aqui vai de qualquer maneira:

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

Se isto não é o que você está procurando, você poderia esclarecer a questão, por favor?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top