\ensuremath 扩展拟合上下文

\ensuremath 扩展拟合上下文

我正在编写一个elisp脚本,将序言中定义的命令扩展为它们的定义。我需要为我的工作做这些替换,同时也简化视力受损的数学学生阅读数学文本的过程。我不是这些文档的作者。我是一名排字员,我的工作是“格式化”科学论文。

例如如果我在序言中有:

\def\PA{\ensuremath{\mathrm{A}}}

我需要将\PA文档中的每个实例扩展为其定义。

我这样做的方式是:在elisp我的脚本的一部分中,在 while 循环中,我:

  • 搜索用户定义的命令(例如\COMMAND),
  • 插入“ \writetotempfile\COMMAND”并编译,
  • 然后我删除\writetotempfile

因此,对于文档中用户定义命令的每个实例,我\writetotempfile每次都使用一次该命令。以下\writetotempfile是代码:

\newcommand{\writetotempfile}[1]
{#1\newwrite\tempfile%
\immediate\openout\tempfile=expandedCommand.tmp%
\immediate\write\tempfile{\unexpanded\expandafter{#1}}%
\immediate\closeout\tempfile}%

例如,当我有

\writetotempfile\PA

它返回文件中的字符串“ \ensuremath {\mathrm {A}}expandedCommand.tmp。我的.tmp文件每次都会被覆盖。


当我\ensuremath在定义中有时,我需要将其删除并扩展命令以适应上下文(例如,在本例中,$\mathrm{A}$或简单地\mathrm{A})。使用一些elisp正则表达式替换,我可以将字符串清理为“ ”,但如果我可以获取适合上下文的“ ”或“非”形式的扩展,\mathrm {A}对我来说会更简单。也就是说,我需要在文本中获取扩展(例如),并在有时获取扩展(或在数学环境中)。$$$\mathrm{A}$some text \PA some text\mathrm{A}$\PA$\PA

一些代码可以阐明我的目的:

\documentclass{article}

\usepackage{xspace}

\def\PA{\ensuremath{\mathrm{A}}\xspace}

\newcommand{\writetotempfile}[1]
{#1\newwrite\tempfile%
\immediate\openout\tempfile=expandedCommand.tmp%
\immediate\write\tempfile{\unexpanded\expandafter{#1}}%
\immediate\closeout\tempfile}

\begin{document}

\writetotempfile\PA   % to be expanded to $\mathrm{A}$

$\writetotempfile\PA$ % to be expanded to \mathrm{A}

\begin{equation}
\writetotempfile\PA   % to be expanded to \mathrm{A}
\begin{equation}

\end{document}

重要!在上面的例子中,我有 3 个实例\writetotempfile,但实际上我每次只会使用一次。

答案1

您可以在 期间重新定义\ensuremath和。\xspace\write

但是,需要受保护的写入,这将产生\protect令牌。

\documentclass{article}

\usepackage{xspace}
\usepackage{xpatch}

\makeatletter
% from https://tex.stackexchange.com/a/229017/4427
% get a copy of \protected@write
\let\protected@iwrite\protected@write
% patch the copy to add \immediate
\xpatchcmd{\protected@iwrite}{\write}{\immediate\write}{}{}
%
\newcommand{\write@ensuremat}[1]{%
  \ifmmode#1\else$#1$\fi
}

\newwrite\tempfile % this must be outside the definition of \writetotempfile
\immediate\openout\tempfile=\jobname.tmp % I want all three occurrences
\newcommand{\writetotempfile}[1]{%
%  \immediate\openout\tempfile=\jobname.tmp
  \protected@iwrite\tempfile{\let\ensuremath\write@ensuremat\let\xspace\@empty}{#1}%
%  \immediate\closeout\tempfile
  #1%
}
\makeatother

\def\PA{\ensuremath{\mathrm{A}}\xspace}


\begin{document}

\writetotempfile\PA   % to be expanded to $\mathrm{A}$

$\writetotempfile\PA$ % to be expanded to \mathrm{A}

\begin{equation}
\writetotempfile\PA   % to be expanded to \mathrm{A}
\end{equation}

\end{document}

我将流的开头移到宏之外,以便在所有三次出现时显示效果(并更改文件名以免破坏我的文件)。

以下是该文件的内容.tmp

$\protect \mathrm  {A}$
\protect \mathrm  {A}
\protect \mathrm  {A}

如您所见,第一个出现的项有美元,而其他两个没有。

答案2

我找到了一个使用该命令的解决方案(仍然需要一些正则表达式替换)\ifmmode

\newcommand{\writetotempfile}[1]
{#1\newwrite\tempfile%
\immediate\openout\tempfile=expandedCommand.tmp%
\ifmmode%
\immediate\write\tempfile{\unexpanded\expandafter{#1}}%
\else%
\immediate\write\tempfile{$\unexpanded\expandafter{#1}$}%
\fi%
\immediate\closeout\tempfile}

现在我已经$在正确的位置,所以我只需要清除字符串中的代码\ensuremath

相关内容