2008-09-18 5 views
9

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

\replace{File,New} 

и что будет генерировать что-то вроде

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

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

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

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

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

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

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

ответ

6

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

Я проголосовал за это - это лучше, чем у меня, чья единственная реальная заслуга в том, что это чистый LaTeX – 2008-09-19 13:34:14

-1

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


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

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

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

2

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

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

\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

Хмммах , Я раньше не использовал пакет токенизатора; похоже, что ваша проблема с пробелами связана с ошибкой в ​​этом пакете. Если вы окружаете макрос «\ GetTokens», скажем, запятыми, то вы увидите, что дополнительное пространство вставляется этим макросом. Поэтому не ваша вина :) – 2008-09-19 19:11:20

+0

Да, я хоть и был. Я попытался добавить несколько случайных «%» в eol в макросе, но безрезультатно. – 2008-09-21 06:13:11

4

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

Да, есть ошибки в пакете tokenizer.Как я уже говорил на моем blog, то багфикс должны использовать следующий корректирующий код вместо просто «\ usepackage [отделка] {токенизатор}»:

\usepackage[trim]{tokenizer} 

\def\[email protected]#1,#2\@empty{% 
    \def\[email protected]{#1}% 
    \ifx\[email protected]\[email protected]% strip spaces if requested 
     \TrimSpaces\[email protected]% 
    \fi% 
    \[email protected]{\[email protected]}{\[email protected]}% 
    \[email protected]{\[email protected]}{#2}% 
    } 
\def\[email protected]#1,#2\@empty{% 
    \def\[email protected]{#2}% 
    \ifx\[email protected]\@empty% 
     \edef\[email protected]{\[email protected]}% 
    \else% 
     \edef\[email protected]{\[email protected]}% 
    \fi% 
    } 

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

Смежные вопросы