如何编写命令来格式化不同的字母?

如何编写命令来格式化不同的字母?

我希望我能有一个命令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

相关内容