Вопрос

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

\replace{File,New}

и это привело бы к появлению чего-то вроде

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

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

Отредактируйте для уточнения

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

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

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

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

Это было полезно?

Решение

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

Другие советы

похоже, что ваша проблема с "пробелами" связана с ошибкой в этом пакете.Если вы окружите макрос "\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%
    }

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

Там есть латексная упаковка под названием токенизатор это может помочь вам делать то, что вы хотите.

Вот хак (но чистый 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}\\  

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

\usepackage{xstring}

[…]

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

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


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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top