
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 breqn
el que realmente necesito.
No tengo idea de por qué breqn
se 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.tex
y 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 breqn
egreg y aún poder usarlo \shellcommand
?
Al retirar el breqn
paquete 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 1000
lo esperado.
TL 2015 en Linux menta 12.2
Respuesta1
El error no se debe a breqn
, sino a calc
que lo carga automáticamente. No tiene nada que ver con etoolbox
ninguno de los dos, porque \@@input
es la primitiva \input
y 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 calc
se 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.