コンパイル中にメッセージを抑制する

コンパイル中にメッセージを抑制する

\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。しかし、 keep の行はメッセージ\@@inputを出力します(filename)。 の出力を読み取るために何か他のものを使用することができますかgnuplot?

これを使用するには、\gpNorm{\res}{1}による計算の結果をgnuplotマクロに割り当てます\res

答え1

抑制する方法はない

(/path/to/filename.tex ...)

\inputプリミティブが読み込まれるファイルを開くたびに、ターミナルとログ ファイルに TeX によって生成されるメッセージ()ファイルの末尾がスキャンされたときに一致が生成されます)。

この診断情報は TeX の奥深くから取得され、マクロで動作を変更することはできません。プリミティブを使用して読み込まれたファイル\font(フォントがまだメモリにロードされていない場合) または と を使用して\openin読み込まれたファイルのみ\readが表示されません。


コマンドの出力がgnuplot1 行であることを知っている場合は、次のようにしてその 1 行を読み取ることができます\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.

これを行う別の方法として、 および で使用可能でpdftexluatexの次のリリースにも含まれる予定の「パイプ入力」機能を利用する方法がありますxetex。 に渡されるファイル名( LaTeX 形式) が で始まる\input(アクティブ) 場合、名前の残りの部分をコマンド ラインとして使用してプロセスが開始され、標準出力が入力ファイルとみなされます。\@@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車輪の再発明を避けてきました。しかし、この場合は1 つのプロセスではなく複数のプロセスが開始されます。お好きなものをお選びください。

関連情報