我想删除未直接定义但在宏中定义的文本中的数学模式。这是我的代码:
\documentclass{book}
\begingroup
\lccode`\~=`$
\lowercase{\endgroup
\def~#1~{\ignorespaces}%
}
\def\removemath{%
\begingroup
\catcode`$=\active
\removemathX
}
\def\removemathX#1{%
#1
\endgroup
}
\edef\nomath#1{
\removemath{#1}
}
\begin{document}
\chapter{XXXXXX}
\newcommand\aaaa{AAA$^{1}$, BBB$^{2}$, CCC$^{3}$, DDD$^{4}$}
\removemath{AAA$^{1}$, BBB$^{2}$, CCC$^{3}$, DDD$^{4}$}
\removemath{\aaaa}
\nomath{\aaaa}
\end{document}
在这个例子中,第一个removemath
有效,但第二个removemath
无效nomath
。我不确定为什么。这是扩展问题吗?也许是其他问题?有人能提出解决方案吗?
答案1
您可以一次删除一个公式:
\documentclass{book}
\makeatletter
\newcommand{\removemath}[1]{%
\expandafter\removemath@#1$$\@nil
}
\def\removemath@#1$#2$#3\@nil{%
#1%
\if\relax\detokenize{#3}\relax
\expandafter\@gobble
\else
\expandafter\@firstofone
\fi
{\removemath@#3\@nil}%
}
\makeatother
\begin{document}
\newcommand\aaaa{AAA$^{1}$, BBB$^{2}$, CCC$^{3}$, DDD$^{4}$}
--\removemath{AAA$^{1}$, BBB$^{2}$, CCC$^{3}$, DDD$^{4}$}--
--\removemath{AAA$^{1}$, BBB$^{2}$, CCC$^{3}$, DDD}--
--\removemath{AAA$^{1}$, BBB, CCC$^{3}$, DDD}--
--\removemath{\aaaa}--
\end{document}
与正则表达式方法相同:
\documentclass{book}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\removemath}{m}
{
\peter_removemath:o { #1 }
}
\cs_new_protected:Nn \peter_removemath:n
{
\tl_set:Nn \l__peter_removemath_tl { #1 }
\regex_replace_all:nnN { \$ [^$]* \$ } {} \l__peter_removemath_tl
\l__peter_removemath_tl
}
\cs_generate_variant:Nn \peter_removemath:n { o }
\tl_new:N \l__peter_removemath_tl
\ExplSyntaxOff
\begin{document}
\newcommand\aaaa{AAA$^{1}$, BBB$^{2}$, CCC$^{3}$, DDD$^{4}$}
--\removemath{AAA$^{1}$, BBB$^{2}$, CCC$^{3}$, DDD$^{4}$}--
--\removemath{AAA$^{1}$, BBB$^{2}$, CCC$^{3}$, DDD}--
--\removemath{AAA$^{1}$, BBB, CCC$^{3}$, DDD}--
--\removemath{\aaaa}--
\end{document}