Замените символ строкой в LaTeX

Я ищу способ сделать замену подстроки в строке в LaTeX. Что я хотел бы сделать, это создать команду, которую я могу вызвать следующим образом:

replace{File,New}

и это породило бы что-то вроде

textbf{File}$rightarrow$textbf{New}

Это простой пример, но я хотел бы иметь возможность поместить форматирование/структуру в одну команду, а не везде в документе. Я знаю, что могу построить несколько команд, которые принимают все большее количество параметров, но я надеюсь, что есть простой способ.

редактировать для разъяснения

Я ищу эквивалент

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

что-то, что может принимать произвольную строку и заменять подстроку другой подстрокой.

поэтому я мог бы вызвать команду с replace{File}, replace{File, New}, replace{File, Options, User} и т. д., оберните слова жирным шрифтом и замените любые запятые командой со стрелкой вправо. Даже если бит" обертывание жирным шрифтом" слишком сложно (как я думаю), просто заменить часть будет полезным.

5 ответов


общий случай довольно сложнее (когда вы не используете запятые в качестве разделителей), но пример, который вы дали, может быть закодирован без особых проблем с некоторыми знаниями внутренних латекса.

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

похоже, что ваша проблема с "пробелами" связана с ошибкой в этом пакете. Если вы окружите макрос "\GetTokens", скажем, запятыми, вы увидите, что дополнительное пространство вставлено этим макросом.

да, в пакете tokenizer есть ошибки. Как я сказал на моем блог, исправление заключается в использовании следующего корректирующего кода вместо " \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%
    }

Я сообщу об этом исправлении разработчику Саша Herpers


есть пакет LaTeX под названием tokenizer который может помочь вам сделать то, что вы хотите.

вот хак (но чистый латекс, без внутренних органов), который приближается к тому, что я думаю, что вы хотите, но с некоторыми посторонними пространствами я не совсем смог исправить. Возможно!--8-->Будут Робертсон можете еще посоветовать? В отличие от его немного более полированного ответа, я не параметризовал биты и куски, вот:

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

попробовать xstring пакета:

\usepackage{xstring}

[…]

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

хорошо, я снимаю этот ответ. Спасибо, что прояснили вопрос.


Я подозреваю, что это может быть не то, что вы хотите, но здесь все равно:

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

Если это не то, что вы ищете, вы не могли бы уточнить вопрос, пожалуйста?