如何使用字符串在 to-string 中包含括号

如何使用字符串在 to-string 中包含括号

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

在此处输入图片描述

请注意,您应用的宏stringstringslaud/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

我不想把我的代币转换成这种东西。

相关内容