Ich verwende ein Makro mit \write18
und \@@input
mehrmals auf jeder Seite eines großen Dokuments. \@@input
Beim Kompilieren wird jedoch eine Meldung ausgegeben:
(filename)
Dies ist sehr ärgerlich und überflutet die anderen relevanten Informationen.
Gibt es eine Möglichkeit, \@@input
während der Kompilierung in meinem Makro (ich verwende pdflatex
) Ruhe zu gebieten?
Was ich jetzt habe, ist Folgendes:
\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
Ich verwende write18
, um ein Berechnungsergebnis von zu erhalten gnuplot
. Aber die Zeile mit dem \@@input
Keep gibt die (filename)
Meldung aus. Kann ich etwas anderes verwenden, um die Ausgabe von zu lesen gnuplot
?
So verwenden Sie es: \gpNorm{\res}{1}
weist das Ergebnis der Berechnung gnuplot
dem Makro zu \res
.
Antwort1
Es gibt keine Möglichkeit, die
(/path/to/filename.tex ...)
Meldung auf dem Terminal und in der Protokolldatei, die von TeX jedes Mal generiert wird, wenn das \input
Grundelement eine einzulesende Datei öffnet (die Übereinstimmung )
wird generiert, wenn das Dateiende gescannt wird).
Diese Diagnoseinformationen stammen aus den Tiefen von TeX und ihr Verhalten kann nicht mit Makros geändert werden. Nur Dateien, die mit den Primitiven \font
(wenn eine Schriftart noch nicht in den Speicher geladen ist) oder mit \openin
und eingelesen wurden \read
, werden nicht angezeigt.
Wenn Sie wissen, dass die Ausgabe des gnuplot
Befehls eine Einzeiler ist, können Sie diese einzelne Zeile wie folgt lesen \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}
Die Ausgabe in der PDF-Datei ist
0,977249868051821
während die Terminalausgabe
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.
Es gibt eine andere Möglichkeit, dies zu tun, indem Sie die Funktion „Pipe Input“ nutzen, die in und verfügbar ist pdftex
und luatex
auch in der nächsten Version von enthalten sein sollte xetex
. Wenn der an übergebene Dateiname (der in LaTeX \input
ist ) mit beginnt (und aktiv ist), wird ein Prozess mit dem Rest des Namens als Befehlszeile gestartet; die Standardausgabe wird als Eingabedatei betrachtet.\@@input
|
-shell-escape
In diesem speziellen Fall kann man jedoch nicht viel tun: Wenn die Befehlszeile Leerzeichen enthält, muss der gesamte „Dateiname“ in doppelte Anführungszeichen gesetzt werden, und die inneren Anführungszeichen zur Angabe gnuplot
der Ausgabe würden den Parser verwirren. Ein Ausweg könnte beispielsweise ein Bash-Skript xoff-norm.sh
mit folgendem Inhalt sein:
#!/usr/bin/env bash
/usr/bin/env gnuplot << EOF
set print "-"
print norm($1)
exit
EOF
damit Ihr Dokument
\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}
Ich habe es immer catchfile
vermieden, das Rad neu zu erfinden. In diesem Fall jedochzweiProzesse werden anstelle von einem gestartet. Treffen Sie Ihre Wahl.