¿Por qué agregar el paquete `breqn` interrumpe el comando `etoolbox`?

¿Por qué agregar el paquete `breqn` interrumpe el comando `etoolbox`?

Estaba intentando egreg buena respuesta.aquíen mi documento principal y descubrí que no funciona allí. Resultó que era porque estaba usando otro paquete que es breqnel que realmente necesito.

No tengo idea de por qué breqnse rompe el comando. Pero aquí hay un 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}

compila usando lualatex -shell-esc foo.texy el error es

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

Observe el "!" adicional añadido allí.

Ahora simplemente comentando la línea \usepackage{etoolbox}y compilando nuevamente, funciona y obtengo el resultado esperado. Sin errores.

¿Hay alguna manera de conservar el comando breqnegreg y aún poder usarlo \shellcommand?

Al retirar el breqnpaquete y compilar:

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

El pdf contiene 1000lo esperado.

TL 2015 en Linux menta 12.2

Respuesta1

El error no se debe a breqn, sino a calcque lo carga automáticamente. No tiene nada que ver con etoolboxninguno de los dos, porque \@@inputes la primitiva \inputy está definida en el núcleo de LaTeX.

Aquí hay un ejemplo realmente mínimo:

\documentclass{article}
\usepackage{calc}

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

\newcounter{c}

\begin{document}

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

\end{document}

El problema parece estar en cómo calcse redefine \setcounter, por lo que -se ve como un signo menos y, por supuesto, todo se rompe. Aquí hay una solución: primero calcule el valor que necesita y guárdelo en una macro temporal.

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

En mi máquina esto imprime 20.

información relacionada