![如何使用字符串在 to-string 中包含括号](https://linux22.com/image/332426/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%9C%A8%20to-string%20%E4%B8%AD%E5%8C%85%E5%90%AB%E6%8B%AC%E5%8F%B7.png)
LaTeX 中的宏命令在字符前排版为 '\=',例如 '\=o' 会创建一个带有宏命令的 'o'。我想使用字符串定义一个新命令,将所有 '/' 字符替换为宏命令 '\=' 序列。但要注意的是,字母 'i' 比较特殊。在 LaTeX 中,您必须使用非点式 'i',例如 '\={\i}' 才能创建带有宏命令的 'i'。这种特殊情况破坏了我的新命令。以下是我对此的尝试:
\documentclass{article}
\usepackage{stringstrings}
\newcommand\macronify[1]{%
\convertword[q]{#1}{/i}{\={\i}}%
\convertchar{\thestring}{/}{\=}%
}
\begin{document}
This is a test: \macronify{laud/o, laud/are, laud/av/i, laudatum}.
\end{document}
在此上运行 pdflatex 会创建一个 PDF,前两个单词确实如预期那样有长音符号,但带有麻烦的“i”的第三个单词则乱七八糟。它显示为“ . . 22 .. , laudatum”。
谢谢你的帮助。
答案1
这是一个更简单的解决方案xstring
\documentclass{article}
\usepackage{xstring}
\newcommand\macronify[1]{%
\saveexpandmode\expandarg
\StrSubstitute{\noexpand#1}{/i}{\noexpand\=\i}[\temp]%
\StrSubstitute\temp/{\noexpand\=}\restoreexpandmode
}
\begin{document}
This is a test: \macronify{laud/o, laud/are, laud/av/i, laudatum}.
\end{document}
答案2
我不建议使用stringstrings
该包执行此任务,因为它很慢、效率低下,并且不适用于操作非正则表达式标记。
但是,出于自豪,我很久以前就编写了这个包,我感到有必要用它来解决这个问题。我确实不得不编辑一个包例程,这个例程忘记了一%
两个,因此在没有编辑的情况下引入了零散的空格。
关键是,对于操作非正则表达式标记(如\=
和\i
),其能力非常有限,并且涉及在 ascii 转义序列中编码此类标记,使用正则表达式例程操作这些序列,然后使用原始宏标记重新填充生成的字符串。
\documentclass{article}
\usepackage{stringstrings}
\newcommand\macronify[1]{%
\encodetoken{\i}%
\encodetoken[2]{\=}%
\convertword[e]{#1}{/i}{\=\i}%
\convertchar[e]{\thestring}{/}{\=}%
\retokenize{\thestring}\thestring%
\decodetoken{\i}%
\decodetoken[2]{\=}%
}
%%%%% ADDED SOME MISSING % SIGNS IN THIS stringstings CODE
\makeatletter
\renewcommand\testmatchingchar[3]{%
\setbox0=\hbox{%
\substring[e]{#1}{#2}{#2}\+%
\isnextbyte[q]{\EscapeChar}{#3}%
\if T\theresult%
\isnextbyte[q]{\EscapeChar}{\thestring}%
\if T\theresult%
\edef\@testcode{\expandafter\@DiscardNextChar\expandafter{#3}}%
\edef\@teststring{\@DiscardNextChar{\thestring}}%
\if \@teststring\@testcode\matchingchartrue\else\matchingcharfalse\fi
\else
\global\matchingcharfalse%
\fi
\else
\if \thestring#3\global\matchingchartrue\else\global\matchingcharfalse\fi
\fi}%
\?}
%%%%%
\makeatother
\begin{document}
This is a test: \macronify{laud/o, laud/are, laud/av/i, laudatum}.
\end{document}
我认为我的荣誉得到了捍卫。
答案3
我不确定如何使用stringstrings
,但有一个更简单的方法:
\documentclass{article}
\usepackage{xparse}
\DeclareTextCompositeCommand{\=}{\encodingdefault}{i}{\={\i}}
\ExplSyntaxOn
\NewDocumentCommand\macronify{m}
{
\tl_set:Nn \l_tmpa_tl { #1 }
\tl_replace_all:Nnn \l_tmpa_tl { / } { \= }
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
This is a test: \macronify{laud/o, laud/are, laud/av/i, laudatum}.
\end{document}
第一条指令定义\=i
为已知组合,将其转换为\={\i}
。因此我们只需要用替换/
,\=
这就是 的工作\tl_replace_all:Nnn
。
请注意,您应用的宏stringstrings
会laud/o
产生
laud\unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {o\global \mathchardef \accent@spacefactor \spacefactor }\accent 22 o\egroup \spacefactor \accent@spacefactor
我不想把我的代币转换成这种东西。