我希望我能有一个命令MyFormatter
,它可以使字母p
变为k
粗体并使字母变为m
斜体t
。
例如:
\MyFormatter{Supermarket}
将输出如下:
苏页呃米应收账钾埃吨
如何在 LaTeX 中编写命令\MyFormatter
?
答案1
这是一个使用 expl3 的简单解决方案。如果您需要它在子组中工作,\MyFormatter{Supermarket and \MakeUppercase{Supermarket}}
您可以检查此解决方案。
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \myformatter { +m } { \xmllmx_myformatter:n { #1 } }
\cs_new_protected:Npn \xmllmx_myformatter:n #1
{
\tl_set:Nn \l_tmpa_tl { #1 }
\tl_replace_all:Nnn \l_tmpa_tl { p } { \textbf{p} }
\tl_replace_all:Nnn \l_tmpa_tl { k } { \textbf{k} }
\tl_replace_all:Nnn \l_tmpa_tl { m } { \textit{m} }
\tl_replace_all:Nnn \l_tmpa_tl { t } { \textit{t} }
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
答案2
使用正则表达式既简单又灵活:
\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\myformatter}{m}
{
\tl_set:Nn \l_tmpa_tl { #1 }
\regex_replace_all:nnN
{ ([kp]+) } { \c{textbf}\cB\{ \1 \cE\} }
\l_tmpa_tl
\regex_replace_all:nnN
{ ([mt]+) } { \c{textit}\cB\{ \1 \cE\} }
\l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\myformatter{Supermarket}
\end{document}
答案3
\MyFormatter
如果以明文形式出现且不是参数的一部分,则使用 catcode 的方法有效。正如 egreg 在这方面指出的那样,\mbox{\MyFormatter{Supermarket}}
这种方法失败了。
然而,我开玩笑地在我的评论中反驳说,解决失败情况的方法是将 放在\mbox
里面MyFormatter
,而不是反过来。当然,这个“修复”的新缺点是 的“m”现在处于活动状态,因此需要 \mbox
额外的: 。\let
\let\MBOX\mbox\MyFormatter{\MBOX{Supermarket}}
最后,wipet 评论说,有人可能会说问题在于 的定义\mbox
,但\hbox{\MyFormatter{Supermarket}}
不会遇到同样的问题。
\documentclass{article}
\let\BB\textbf
\let\II\textit
\let\CC\catcode
\let\AC\active
\let\SVP p \let\SVK k \let\SVM m \let\SVT t
\def\CODESON{\CC`p=\AC \CC`k=\AC \CC`m=\AC \CC`t=\AC }
\def\CODESOFF{\CC`p=11 \CC`k=11 \CC`m=11 \CC`t=11 }
\CODESON
\def p{\BB{\SVP}}
\def k{\BB{\SVK}}
\def m{\II{\SVM}}
\def t{\II{\SVT}}
\CODESOFF
\newcommand\MF[1]{#1\CODESOFF}
\newcommand\MyFormatter{\CODESON\MF}
\begin{document}
Supermarket \MyFormatter{Supermarket} Supermarket
\mbox{\MyFormatter{Supermarket}} fails, but
\let\MBOX\mbox\MyFormatter{\MBOX{Supermarket}} works
\end{document}
答案4
例如使用 OPmac:
\input opmac
\def\MyFormatter{\afterassignment\MyFormatterA \def\tmpb}
\def\MyFormatterA{\replacestrings{p}{{\bf p}}\replacestrings{k}{{\bf k}}%
\replacestrings{m}{{\it m}\/}\replacestrings{t}{{\it t}\/}\tmpb}
\MyFormatter{Supermarket}
\bye