Eu uso uma macro com \write18
e \@@input
várias vezes em cada página de um documento grande. Mas \@@input
envie uma mensagem durante a compilação:
(filename)
Isso é muito chato e inunda outras informações relevantes.
Existe uma maneira de fazer \@@input
silêncio durante a compilação na minha macro (eu uso pdflatex
)?
O que tenho agora é o seguinte:
\makeatletter
\newcommand*{\gpNorm}[3][\jobname.eval]{%
\edef\inp@t{#3}%
\immediate\write18{gnuplot -e 'set print "#1"; print norm(\inp@t)'}%
\everyeof{\noexpand}%
\edef#2{\@@input #1 }%
}
\makeatother
Eu uso write18
para obter um resultado de cálculo de gnuplot
. Mas a linha com \@@input
keep gera a (filename)
mensagem. Posso usar outra coisa para ler a saída de gnuplot
?
Para usá-lo: \gpNorm{\res}{1}
atribuirá o resultado do cálculo gnuplot
à macro \res
.
Responder1
Não há como suprimir o
(/path/to/filename.tex ...)
mensagem no terminal e no arquivo de log que é gerado pelo TeX toda vez que a \input
primitiva atua abrindo um arquivo para ser lido (a correspondência )
é gerada quando o final do arquivo é verificado).
Essas informações de diagnóstico vêm das profundezas do TeX e o comportamento não pode ser alterado com macros. Apenas os arquivos lidos com os primitivos \font
(quando uma fonte ainda não está carregada na memória) ou com \openin
e \read
não são mostrados.
Se você sabe que a saída do gnuplot
comando é uma linha, você pode ler essa única linha com \read
:
\documentclass{article}
\makeatletter
\newread\gnuplot@read
\newcommand\gpNorm[3][\jobname.eval]{%
\immediate\write18{gnuplot -e 'set print "#1"; print norm(#3)'}%
\openin\gnuplot@read=#1\relax
\read\gnuplot@read to#2\relax
\closein\gnuplot@read
}
\makeatother
\begin{document}
\gpNorm\foo{1+1}
\foo
\end{document}
A saída no arquivo PDF é
0,977249868051821
enquanto a saída do terminal estiver
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012)
\write18 enabled.
entering extended mode
(./xoff.tex
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, ge
rman-x-2012-05-30, ngerman-x-2012-05-30, afrikaans, ancientgreek, ibycus, arabi
c, armenian, basque, bulgarian, catalan, pinyin, coptic, croatian, czech, danis
h, dutch, ukenglish, usenglishmax, esperanto, estonian, ethiopic, farsi, finnis
h, french, friulan, galician, german, ngerman, swissgerman, monogreek, greek, h
ungarian, icelandic, assamese, bengali, gujarati, hindi, kannada, malayalam, ma
rathi, oriya, panjabi, tamil, telugu, indonesian, interlingua, irish, italian,
kurmanji, latin, latvian, lithuanian, mongolian, mongolianlmc, bokmal, nynorsk,
piedmontese, polish, portuguese, romanian, romansh, russian, sanskrit, serbian
, serbianc, slovak, slovenian, spanish, swedish, turkish, turkmen, ukrainian, u
ppersorbian, welsh, loaded.
(/usr/local/texlive/2012/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/local/texlive/2012/texmf-dist/tex/latex/base/size10.clo))
No file xoff.aux.
[1{/usr/local/texlive/2012/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
(./xoff.aux) )</usr/local/texlive/2012/texmf-dist/fonts/type1/public/amsfonts/c
m/cmr10.pfb>
Output written on xoff.pdf (1 page, 11836 bytes).
Transcript written on xoff.log.
Existe uma maneira diferente de fazer isso, explorando o recurso "pipe input" que está disponível pdftex
e luatex
também deve ser incluído na próxima versão do xetex
. Se o nome do arquivo passado para \input
(que está \@@input
em LaTeX) começar com |
(e -shell-escape
estiver ativo), então um processo é iniciado com o resto do nome como linha de comando; a saída padrão é considerada o arquivo de entrada.
Porém, neste caso específico não há muito o que fazer: se a linha de comando contiver espaços, todo o "nome do arquivo" deverá ser colocado entre aspas duplas e as internas para informar gnuplot
a saída confundirão o analisador. Uma saída poderia ser ter um script Bash, digamos xoff-norm.sh
, com o seguinte conteúdo:
#!/usr/bin/env bash
/usr/bin/env gnuplot << EOF
set print "-"
print norm($1)
exit
EOF
para que seu documento possa ser
\documentclass{article}
\usepackage{catchfile}
\makeatletter
\newcommand\gpNorm[2]{%
\CatchFileEdef#1{"|bash ./xoff-norm.sh #2"}{\everyeof{\noexpand}\endlinechar\m@ne}}
}
\makeatother
\begin{document}
\gpNorm\foo{1+1}
\foo
\end{document}
Eu costumava catchfile
evitar reinventar a roda. Neste caso, porém,doisprocessos são iniciados em vez de um. Faça sua escolha.