編譯期間抑制訊息

編譯期間抑制訊息

我在大型文件的每一頁中多次使用巨集和\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。但帶有\@@inputkeep 的行輸出(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避免重新發明輪子。但在這種情況下,進程被啟動而不是一個。隨你挑選。

相關內容