使用字体命令进行 xstring 替换失败,出现错误

使用字体命令进行 xstring 替换失败,出现错误

我想用普通字体替换\dots排版的名称部分之间的一些空格\ttfamily

下面的示例除了注释部分外都有效,但注释部分却出现错误:TeX capacity exceeded, sorry [input stack size=5000] \StrSubstitute{\pxname}{ }{\normaldots}

\documentclass{article}

\usepackage{xstring}

%normaldots
\newcommand{\normaldots}{{\fontfamily{\familydefault}\fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont\normalsize\dots}}

\newcommand{\pxlastname}{Van der Laak}
\newcommand{\pxfirstname}{Cor}
\newcommand{\pxname}{\pxlastname\normaldots\pxfirstname}

\begin{document}
{\ttfamily\scshape\Huge\MakeLowercase{\pxname\normaldots test}}
\newline
%\StrSubstitute{\pxname}{ }{\normaldots}[\pxoutput]
%{\ttfamily\scshape\Huge\MakeLowercase{\pxoutput\normaldots test}}
\end{document}

答案1

xstring默认情况下, 会对其参数进行完全扩展。因此,最大的问题是 也会\normaldots被扩展,而这并不是你想要的。

您可以\normaldots使用以下命令“强化”该命令etoolbox

\documentclass{article}

\usepackage{xstring,etoolbox}

%normaldots
\newrobustcmd{\normaldots}{{\normalfont\normalsize\dots}}

\newcommand{\pxlastname}{Van der Laak}
\newcommand{\pxfirstname}{Cor}
\newcommand{\pxname}{\pxlastname\normaldots\pxfirstname}

\begin{document}
{\ttfamily\scshape\Huge\MakeLowercase{\pxname\normaldots test}}
\newline

\StrSubstitute{\pxname}{ }{\normaldots}[\pxoutput]
{\ttfamily\scshape\Huge\MakeLowercase{\pxoutput\normaldots test}}

\end{document}

这样,在执行时,\normaldots未展开的将通过所\edef执行的。xstring\StrSubstitute

还要注意,\normaldots可以用比你更简单的方式定义。

在此处输入图片描述

答案2

以下是使用 stringstrings 的替代解决方案:

\documentclass{article}
\makeatletter
\let\protectededef\protected@edef
\makeatother

%\usepackage{xstring}
\usepackage{stringstrings}

\newcommand{\normaldots}{{\fontfamily{\familydefault}\fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont\normalsize\dots}}

\newcommand{\pxlastname}{Van der Laak}
\newcommand{\pxfirstname}{Cor}
\newcommand{\pxname}{\pxlastname\normaldots\pxfirstname}

\newcommand\pxoutput{\dpxlastname\normaldots\pxfirstname}

\begin{document}
{\ttfamily\scshape\Huge\MakeLowercase{\pxname\normaldots test}}
\newline
%\StrSubstitute{\pxname}{ }{\normaldots}[\pxoutput]

\encodetoken[1]{\normaldots}
\convertword[e]{\pxlastname}{~}{\normaldots}
\retokenize{\thestring}

\protectededef\dpxlastname{\thestring}
\decodetoken[1]{\normaldots}

{\ttfamily\scshape\Huge\MakeLowercase{\pxoutput\normaldots test}}
\end{document}

相关内容