从文档中提取某个命令的所有参数

从文档中提取某个命令的所有参数

我有一个命令\foo,它接受两个参数,我在整个文档中使用了大约一百次(但从未在另一个实例的参数中使用过\foo)。我现在想对语言 A 中的每个第一个参数和语言 B 中的每个第二个参数进行拼写检查。我的文档中还有许多其他文本,我不想对其进行拼写检查。

这里的主要问题是解析 的所有第一个或第二个参数\foo。理论上我可以编写一个脚本来提取这些参数,但我想有人已经这样做了,并处理了所有注意事项和特殊情况。所以,本质上我正在寻找一种工具,可以让我提取整个文档中某个命令的所有参数。将输出输入拼写检查器应该没有问题。

我使用的是 Linux,因此我应该能够运行大多数东西。我更喜欢将参数写入文件stdout或写入文件的解决方案。

以下问题和答案均不能令人满意地解决我的问题:

答案1

我认为 Perl 脚本(或您最喜欢的任何脚本语言)效率更高。但也可以采用 TeX 来实现。

以 Werner 的输入为模型,这里是一种写出两个文件的方法,\foo分别包含 的第一个和第二个参数。

\documentclass{article}

\usepackage{xcolor}

\colorlet{langA}{red!30}
\colorlet{langB}{blue!30}

\newcommand{\foo}[2]{%
  % the original definition (supply yours)
  \textcolor{langA}{#1}--\textcolor{langB}{#2}%
  % the added part
  \write\langAout{\detokenize{#1}}\write\langBout{\detokenize{#2}}%
}
\newwrite\langAout
\newwrite\langBout
\immediate\openout\langAout=\jobname-a.out
\immediate\openout\langBout=\jobname-b.out

\begin{document}

Lorem ipsum dolor sit amet, \foo{consectetur}{adipiscing} elit. Phasellus elementum 
urna quis \foo{mi}{fermentum}, sit amet congue ex lobortis. Vivamus vulputate turpis 
neque, nec rutrum magna tempor ac. \foo{Sed}{pulvinar} tristique tempor. Sed venenatis 
tincidunt nunc, sit amet dictum eros. Proin sed consequat turpis. \foo{Nulla}{ut} mauris 
lacinia \foo{lacus}{sollicitudin} imperdiet at ut lorem. Sed in efficitur ante. Nulla 
scelerisque, \foo{massa}{pharetra} dictum vestibulum, lectus diam elementum ante, id 
ultricies lectus tellus sed turpis. Phasellus \foo{nec}{maximus} dolor. Cras vehicula 
tincidunt quam finibus fringilla. Maecenas eget leo nec quam \foo{venenatis}{sagittis}. 
\foo{Etiam}{eget} est id mauris mollis egestas nec eget sapien. Suspendisse aliquet massa 
at urna mattis fermentum. \foo{Quisque}{quis} sem turpis. Donec viverra ornare leo, sit 
amet consectetur lacus eleifend a. Fusce \foo{elementum}{sem} volutpat ante mattis luctus.

Proin \foo{volutpat}{justo} quis fringilla viverra. Integer erat lectus, facilisis at 
posuere a, maximus at libero. \foo{Phasellus}{malesuada} tincidunt turpis quis condimentum. 
Ut eget nibh id lorem vulputate sagittis. Pellentesque \foo{habitant}{morbi} tristique 
senectus et netus et malesuada \foo{fames}{ac} turpis egestas. Etiam et malesuada magna. 
Pellentesque dictum \foo{blandit}{est}, at condimentum nunc volutpat a. Donec venenatis 
orci sapien, eu placerat ligula \foo{pulvinar}{eget}.

\end{document}

如果主文件名为test.tex,那么您将获得两个名为test-a.out和 的文件test-b.out

test-a.out

consectetur
mi
Sed
Nulla
lacus
massa
nec
venenatis
Etiam
Quisque
elementum
volutpat
Phasellus
habitant
fames
blandit
pulvinar

test-b.out

adipiscing
fermentum
pulvinar
ut
sollicitudin
pharetra
maximus
sagittis
eget
quis
sem
justo
malesuada
morbi
ac
est
eget

答案2

以下是改编从 LaTeX 文档中提取所有强调的单词,现在仅用于两个参数。第一个参数存储在 中\firstfoo,而第二个参数存储在 中\secondfoo

在此处输入图片描述

\documentclass{article}
\newcommand{\foo}[2]{%
  % <your original definition>
}

\makeatletter
\newcommand{\firstfoo}{}
\newcommand{\secondfoo}{}
\renewcommand{\foo}[2]{%
  \textit{#1} \textbf{#2}% Just for display
  \g@addto@macro{\firstfoo}{#1\space}% Add first argument to \firstfoo
  \g@addto@macro{\secondfoo}{#2\space}% Add second argument to \secondfoo
}
\makeatother

\begin{document}

Lorem ipsum dolor sit amet, \foo{consectetur}{adipiscing} elit. Phasellus elementum 
urna quis \foo{mi}{fermentum}, sit amet congue ex lobortis. Vivamus vulputate turpis 
neque, nec rutrum magna tempor ac. \foo{Sed}{pulvinar} tristique tempor. Sed venenatis 
tincidunt nunc, sit amet dictum eros. Proin sed consequat turpis. \foo{Nulla}{ut} mauris 
lacinia \foo{lacus}{sollicitudin} imperdiet at ut lorem. Sed in efficitur ante. Nulla 
scelerisque, \foo{massa}{pharetra} dictum vestibulum, lectus diam elementum ante, id 
ultricies lectus tellus sed turpis. Phasellus \foo{nec}{maximus} dolor. Cras vehicula 
tincidunt quam finibus fringilla. Maecenas eget leo nec quam \foo{venenatis}{sagittis}. 
\foo{Etiam}{eget} est id mauris mollis egestas nec eget sapien. Suspendisse aliquet massa 
at urna mattis fermentum. \foo{Quisque}{quis} sem turpis. Donec viverra ornare leo, sit 
amet consectetur lacus eleifend a. Fusce \foo{elementum}{sem} volutpat ante mattis luctus.

Proin \foo{volutpat}{justo} quis fringilla viverra. Integer erat lectus, facilisis at 
posuere a, maximus at libero. \foo{Phasellus}{malesuada} tincidunt turpis quis condimentum. 
Ut eget nibh id lorem vulputate sagittis. Pellentesque \foo{habitant}{morbi} tristique 
senectus et netus et malesuada \foo{fames}{ac} turpis egestas. Etiam et malesuada magna. 
Pellentesque dictum \foo{blandit}{est}, at condimentum nunc volutpat a. Donec venenatis 
orci sapien, eu placerat ligula \foo{pulvinar}{eget}.

\verb|\firstfoo|: {\itshape \firstfoo}

\verb|\secondfoo|: {\bfseries \secondfoo}

\end{document}

答案3

总体方案如下:

\newif\iflanguageA
\def\foo#1#2{\iflanguageA your action on #1\else your action on #1 \fi}

使用方式:

\languageAtrue

\foo12, 

\languageAfalse

\foo12.

您有条件\iflanguageA(要选择名称)和布尔值\languageAtrue\languageAfalse

相关内容