\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
が表示されません。
コマンドの出力がgnuplot
1 行であることを知っている場合は、次のようにしてその 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.
これを行う別の方法として、 および で使用可能でpdftex
、luatex
の次のリリースにも含まれる予定の「パイプ入力」機能を利用する方法があります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 つのプロセスではなく複数のプロセスが開始されます。お好きなものをお選びください。