我有一个命令\foo
,它接受两个参数,我在整个文档中使用了大约一百次(但从未在另一个实例的参数中使用过\foo
)。我现在想对语言 A 中的每个第一个参数和语言 B 中的每个第二个参数进行拼写检查。我的文档中还有许多其他文本,我不想对其进行拼写检查。
这里的主要问题是解析 的所有第一个或第二个参数\foo
。理论上我可以编写一个脚本来提取这些参数,但我想有人已经这样做了,并处理了所有注意事项和特殊情况。所以,本质上我正在寻找一种工具,可以让我提取整个文档中某个命令的所有参数。将输出输入拼写检查器应该没有问题。
我使用的是 Linux,因此我应该能够运行大多数东西。我更喜欢将参数写入文件stdout
或写入文件的解决方案。
以下问题和答案均不能令人满意地解决我的问题:
- 如何对多种语言/语言变体的 LaTeX 进行拼写检查– 问题特定于某个编辑器,到目前为止唯一的解决方案是使用外部文件(这对我来说是不可行的,并且无论如何都需要解析才能自动设置)。
- 从乳胶文档中提取所有强调的单词–这个答案可能会有用,但其目的是在单个文档内进行收集和打印,因此可能对我的需求来说过于复杂。
- https://tex.stackexchange.com/q/193097/28608– 据我所知,这个问题也旨在解决 TeX 中的问题。
答案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
。