warum unterbricht das Hinzufügen des `breqn`-Pakets den `etoolbox`-Befehl?

warum unterbricht das Hinzufügen des `breqn`-Pakets den `etoolbox`-Befehl?

Ich habe versucht, egreg nette AntwortHierin meinem Hauptdokument und ich habe festgestellt, dass es dort nicht funktioniert. Es stellte sich heraus, dass es daran liegt, dass ich zufällig ein anderes Paket verwende, das breqnich wirklich brauche.

Ich habe keine Ahnung, warum breqnder Befehl abbricht. Aber hier ist ein 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}

kompilieren mit lualatex -shell-esc foo.texund der Fehler ist

(/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

Beachten Sie das dort hinzugefügte zusätzliche „!“.

Jetzt muss ich nur noch die Zeile kommentieren \usepackage{etoolbox}und erneut kompilieren, es funktioniert und ich bekomme das erwartete Ergebnis. Keine Fehler.

Gibt es eine Möglichkeit, den Befehl „egreg“ beizubehalten breqnund trotzdem verwenden zu können \shellcommand?

Beim Entfernen des breqnPakets und Kompilieren:

>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.
>

Das PDF enthält 1000wie erwartet.

TL 2015 auf Linux Mint 12.2

Antwort1

Der Fehler liegt nicht an breqn, sondern daran, dass es automatisch geladen wird. Es hat mit beidem calcnichts zu tun , da es sich um das Primitiv handelt und im Kernel von LaTeX definiert ist.etoolbox\@@input\input

Hier ist ein wirklich minimales Beispiel:

\documentclass{article}
\usepackage{calc}

\makeatletter
\newcommand{\shellcommand}[1]{\@@input"|#1"}
\makeatother

\newcounter{c}

\begin{document}

\setcounter{c}{\shellcommand{id -g}}
\arabic{c}

\end{document}

Das Problem scheint darin zu liegen, wie calcneu definiert wird \setcounter, sodass -als Minuszeichen angesehen wird und natürlich alles kaputt geht. Hier ist eine Problemumgehung: Berechnen Sie zuerst den benötigten Wert und speichern Sie ihn in einem temporären Makro.

\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}

Auf meinem Rechner wird 20 ausgedruckt.

verwandte Informationen