在我的源代码中我希望Snap!
自动替换为Snap\textit{!}
\newcommand{Snap!}{Snap\textit{!}}
出现“缺失数字,视为零”的错误
答案1
我同意这样的评论:最好在编辑器中处理这个问题,而不是在 LaTeX 中。但本着提供 LaTeX 答案的精神...
纯净listofitems
版
这里,宏将检查其参数,并用\snap
替换。但是,与下面显示的方法不同,此版本不会在参数内部找到出现的情况,例如。Snap!
Snap\textit{!}
tokcycle
Snap!
\textbf{blah Snap! blah}
\documentclass{article}
\usepackage{tokcycle,listofitems,xcolor}
\setsepchar{Snap!}
\newcommand\snap[1]{%
\readlist\mysnaps{#1}%
\foreachitem\z\in\mysnaps[]{%
\ifnum\zcnt=1\else Snap\textit{!}\fi
\z
}%
}
\begin{document}
\snap{%
There is Snap! and other Snap and snappy *Snap!* words!
}
\end{document}
tokcycle
版本
如果您可以接受!
被视为“字母”(catcode-11),那么这个tokcycle
环境\snap...\endsnap
将找到精确的实例Snap!
并将其替换!
为斜体。
\documentclass{article}
\usepackage{tokcycle,listofitems,xcolor}
\catcode`!=11
\setsepchar{Snap!}
\newcommand\testdict{%
\if\relax\detokenize\expandafter{\currentword}\relax\else
{\ignoreemptyitems
\greadlist\dictcompA{\currentword}}%
\readlist\dictcompB{\currentword}%
\ifnum\listlen\dictcompA[]=0\relax
\addcytoks[1]{\autohighlightStyleA}%
\addcytoks[1]{\expandafter{\currentword}}
\else
\ifnum\listlen\dictcompB[]>1\relax
\addcytoks[1]{\autohighlightStyleB}%
\addcytoks[1]{\expandafter{\currentword}}
\else
\addcytoks[1]{\currentword}%
\fi
\fi
\fi
\gdef\currentword{}%
}
\makeatletter
\xtokcycleenvironment\snap
{\tctestifcatnx A##1{\g@addto@macro\currentword{##1}}
{\testdict\addcytoks{##1}}}
{\testdict\groupedcytoks{\processtoks{##1}\testdict}}
{\g@addto@macro\currentword{##1}}
{\testdict\addcytoks{##1}}
{\stripgroupingtrue\def\currentword{}}
{}
\makeatother
\newcommand\autohighlightStyleA{\snapit}
\newcommand\autohighlightStyleB{\snapit}
\newcommand\snapit[1]{Snap\textit{!}}
\begin{document}
\snap
There is Snap! and other Snap and snappy *Snap!* words!
\endsnap
\end{document}