我在大型文件的每一頁中多次使用巨集和\write18
, 。\@@input
但\@@input
編譯時輸出一則訊息:
(filename)
這非常煩人,並且淹沒了其他相關資訊。
有沒有辦法\@@input
在我的巨集編譯過程中保持安靜(我使用pdflatex
)?
我現在擁有的是以下內容:
\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
我用來write18
取得計算結果gnuplot
。但帶有\@@input
keep 的行輸出(filename)
訊息。我可以使用其他東西來讀取 的輸出gnuplot
嗎?
使用方法:\gpNorm{\res}{1}
將計算結果指派gnuplot
給巨集\res
。
答案1
沒有辦法抑制
(/path/to/filename.tex ...)
終端機上以及 TeX 每次透過開啟要讀入的文件進行操作時產生的日誌檔案中的消息(掃描文件末尾時產生\input
匹配)。)
此診斷資訊來自 TeX 內部深處,且無法使用巨集來變更行為。僅使用基元讀入的檔案\font
(當字體尚未載入到記憶體中)或使用 和 讀入的\openin
檔案\read
不會顯示。
如果您知道該命令的輸出gnuplot
是一行,那麼您可以使用以下命令讀取該單行\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}
PDF 檔案中的輸出是
0.977249868051821
而終端輸出是
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.
有一種不同的方法可以做到這一點,即利用“管道輸入”功能,該功能可以在 和 中使用,pdftex
並且luatex
也應該包含在xetex
.如果傳遞給\input
(在 LaTeX 中)的檔案名稱以(並且處於活動狀態)\@@input
開頭,則進程將啟動,名稱的其餘部分將作為命令列;標準輸出被視為輸入檔。|
-shell-escape
然而,在這種特殊情況下,沒有什麼可做的:如果命令列中有空格,則整個「檔案名稱」必須用雙引號引起來,而用於告訴gnuplot
輸出的內部引號將使解析器感到困惑。解決方法可能是使用 Bash 腳本,例如xoff-norm.sh
,包含以下內容:
#!/usr/bin/env bash
/usr/bin/env gnuplot << EOF
set print "-"
print norm($1)
exit
EOF
這樣你的文件就可以
\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}
我曾經catchfile
避免重新發明輪子。但在這種情況下,二進程被啟動而不是一個。隨你挑選。