删除宏定义文本中的数学模式

删除宏定义文本中的数学模式

我想删除未直接定义但在宏中定义的文本中的数学模式。这是我的代码:

\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}

相关内容