![为什么添加“breqn”包会破坏“etoolbox”命令?](https://linux22.com/image/316045/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%B7%BB%E5%8A%A0%E2%80%9Cbreqn%E2%80%9D%E5%8C%85%E4%BC%9A%E7%A0%B4%E5%9D%8F%E2%80%9Cetoolbox%E2%80%9D%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我正在尝试给出很好的答案这里在我的主文档中,我发现它在那里不起作用。原来是因为我碰巧使用了另一个breqn
我真正需要的包。
我不知道为什么 breqn
命令会中断。但这是一个 MWE
\documentclass[10pt,notitlepage]{article}
\usepackage{etoolbox}%see https://tex.stackexchange.com/questions/257621
\makeatletter
\newcommand{\shellcommand}[1]{\@@input"|#1"}
\makeatother
\usepackage{breqn}
\newcounter{c}
\begin{document}
\setcounter{c}{\shellcommand{id -g}}
\arabic{c}
\end{document}
使用编译lualatex -shell-esc foo.tex
,错误是
(/usr/local/texlive/2015/texmf-dist/tex/latex/tools/calc.sty)) (./foo2.aux)
("|id -g!"id: invalid option -- '!'
Try 'id --help' for more information.
Runaway argument?
! Paragraph ended before \@calc@pre@scan was complete.
<to be read again>
\par
l.1
请注意那里添加了额外的“!”。
现在只需注释该行\usepackage{etoolbox}
并再次编译,它就可以工作,并且我得到了预期的结果。没有错误。
有没有办法保留breqn
并仍然能够使用 egreg\shellcommand
命令?
删除breqn
包并编译时:
>lualatex -shell-esc foo2.tex
This is LuaTeX, Version beta-0.80.0 (TeX Live 2015) (rev 5238)
\write18 enabled.
(./foo2.tex
LaTeX2e <2015/01/01> patch level 2
Babel <3.9l> and hyphenation patterns for 79 languages loaded.
(/usr/local/texlive/2015/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/local/texlive/2015/texmf-dist/tex/latex/base/size10.clo))
(/usr/local/texlive/2015/texmf-dist/tex/latex/etoolbox/etoolbox.sty)
(./foo2.aux) ("|id -g") [1{/usr/local/texlive/2015/texmf-var/fonts/map/pdftex/up
dmap/pdftex.map}] (./foo2.aux))
264 words of node memory still in use:
2 hlist, 1 vlist, 1 rule, 2 glue, 40 glue_spec, 1 write nodes
avail lists: 1:4,2:12,3:3,4:22,6:11,7:1,9:6
<</usr/local/texlive/2015/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on foo2.pdf (1 page, 8298 bytes).
Transcript written on foo2.log.
>
pdf 包含1000
预期的内容。
Linux mint 12.2 上的 TL 2015
答案1
错误不是由于breqn
,而是calc
由于它自动加载的 。这与两者都无关etoolbox
,因为\@@input
是原语\input
,并且是在 LaTeX 内核中定义的。
这是一个非常简单的例子:
\documentclass{article}
\usepackage{calc}
\makeatletter
\newcommand{\shellcommand}[1]{\@@input"|#1"}
\makeatother
\newcounter{c}
\begin{document}
\setcounter{c}{\shellcommand{id -g}}
\arabic{c}
\end{document}
问题似乎在于如何calc
重新定义\setcounter
,因此-
被视为减号,当然一切都会中断。这里有一个解决方法:首先计算所需的值并将其存储在临时宏中。
\documentclass{article}
\usepackage{xparse,catchfile}
\usepackage{calc}
\makeatletter
\DeclareExpandableDocumentCommand{\shellcommand}{om}{%
\IfNoValueTF{#1}
{\@@input"|#2"}
{\CatchFileEdef#1{"|#2"}{}}%
}
\makeatother
\newcounter{c}
\begin{document}
\shellcommand[\temp]{id -g}
\setcounter{c}{\temp}
\arabic{c}
\end{document}
在我的机器上这会打印 20。