我想用普通字体替换\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}