我正在编写一个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
。