Заменить символ на строку в LaTeX - PullRequest
9 голосов
/ 18 сентября 2008

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

\replace{File,New}

и это сгенерирует что-то вроде

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

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

Редактировать для уточнения

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

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

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

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

Ответы [ 5 ]

6 голосов
/ 19 сентября 2008

Общий случай довольно сложен (когда вы не используете запятые в качестве разделителей), но приведенный вами пример можно без особых проблем кодировать, если вы немного разбираетесь во внутренностях 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}
4 голосов
/ 25 февраля 2011

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

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

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

2 голосов
/ 09 июня 2009

Попробуйте пакет xstring :

\usepackage{xstring}

[…]

\StrSubstitute{File,New}{,}{\(\rightarrow\)}
2 голосов
/ 19 сентября 2008

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

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

\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 голосов
/ 18 сентября 2008

ОК, я отозвал этот ответ. Спасибо за разъяснение вопроса.


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

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

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

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