9

私は論文/学位論文を書いていますが、それは進行中の作業であるため、ドキュメントに挿入する図の実際の画像が常に用意されているわけではありませんが、さまざまな理由から、代わりにダミーの図を自動的に配置したいと考えています。含まれているグラフィックファイルが存在しない場合。たとえば、次のようなことができます\includegraphics[width=8cm]{\chapdir/figures/fluxcapacitor}(where\chapdirは「現在の」チャプター ディレクトリのマクロです。たとえば\def\chapdir{./ch_timetravel}、存在しない場合は代わりに./ch_timetravel/figures/fluxcapacitor.jpg挿入されます。./commands/dummy.jpg

私は自分のマクロを (単純に?) マクロ ( ) を持つように構成しました。マクロ ( ) は、マクロ ( \figFileOrDummy) に提供された引数が存在するかどうかをチェックして、含める適切なファイルを決定し、 を呼び出すことができます\includegraphics[properties]{\figFileOrDummy{\chapdir/figures/fluxcapacitor}}。これをどのように呼び出そうとするかに応じてさまざまなエラーが発生することを除いて、「優れたLaTeXプログラミング」に関する限り、根本的に欠陥のある方法で問題に取り組んでいることを示唆しているようです。

ファイルが存在するかどうかを確認するマクロを次に示します (そして、ファイル名またはダミー ファイル名のいずれかを「返します」)。


\newcommand{\figFileOrDummy}[1]{%
    % Figure base name (no extension) to be used if the file exists
    \def\fodname{#1}%
    \def\dummyfig{commands/dummy}%
    % Check if output is PS (.EPS) or PDF (.JPG/.PDF/.PNG/...) figures
    \ifx\pdfoutput\undefined%
        % EPS figures only
        \IfFileExists{\fodname.eps}{}{\def\fodname{\dummyfig}}%
    \else%
        % Check existence of various extensions: PDF, TIF, TIFF, JPG, JPEG, PNG, MPS
        \def\figtest{0}% flag below compared to this value
        \IfFileExists{\fodname.pdf}{\def\figfilenamefound{1}}{\def\figfilenamefound{0}}%
        \IfFileExists{\fodname.jpg}{\def\figfilenamefound{1}}{}%
        \IfFileExists{\fodname.png}{\def\figfilenamefound{1}}{}%
        % and so on...
        % If no files found matching the filename (flag is 0) then use the dummy figure
        \ifx\figfilenamefound\figtest%
            \def\fodname{\dummyfig}%
        \fi%
    \fi%
    % 'return' the filename
    \fodname%
}%

または、同様の問題があると思われる、より単純なバージョンを次に示します。

\newcommand{\figFileOrDummy}[1]{%
    \def\dummyfig{commands/dummy}%
    \dummyfig%
}

\defコマンドは、定義しようとしているマクロの展開に処理されるように見えるため、最終的に\def {commands/dummy}...( の後のスペースに注意してください\def) になり、明らかに不平を言います。

\includegraphicsまた、マクロのリテラルの内容を最初に解決/展開するのではなく、ファイル名として扱うように見えるため、ファイル'\def {commands/dummy}... .png'が存在しないと不平を言います..

完全なマクロではなくだけを保持する\edef\figfilename{\figFileOrDummy{\chapdir/figures/fluxcapacitor}}ように強制しようとするようなことも 試みましたが、マクロでしようとしている変数が未定義であるというエラーが表示されます。\figfilenameUndefined control sequence\def\figFileOrDummy

だから私の質問はどちらかです

  1. このマクロを適切に展開するにはどうすればよいですか?; また
  2. これがマクロの構造化の間違った方法である場合、ダミー/実数値を自動的に挿入できるようにするには、実際にそのようなマクロをどのように構造化すればよいですか?; また
  3. 私が見落としていたこの種のことをうまく処理するパッケージはありますか?

ここでかなり基本的な何かが欠けているように感じます...

4

3 に答える 3

3

ポイントは、\expandafter は、ファイル名を表す文字列としての引数にのみ関心があるため、それを評価しないということだと思います — マクロ言語は怠け者です! 試してみてください\expandafter {\includegraphics[width=8cm]}{\chapdir/figures/fluxcapacitor}

スタイルの 2 つのポイント:

  1. 行が制御シーケンスで終わっている場合は、偽の空白を止めるために行末に % を置く必要はありません: 制御シーケンスは、行末を含むすべての後続の空白を飲み込みます。これにより、私の好みでは、コードがはるかに読みやすくなります。特に、Tex の「口」に対して\def\newcs{abc}\def \newcs {abc}は同一であることに注意してください。これらはまったく同じトークンのシーケンスです。
  2. \figtest の周りのコードを削除しました: \newif プリミティブ (\newif\figexists で新しいテストを作成し、\figexiststrue、\figexistsfalse で設定/リセット、およびテスト) のいずれかを使用すると、より良いエラー レポートが得られます。 \iffigexists...) または Latex ifthenelse パッケージ (正統性を維持するため)。

クリーンアップされたコード

私は最初、問題は別の場所にあると思っていたので、もっときれいなことを書きました。

\def\dummypath{commands/dummy}%
\ifx\pdfoutput\undefined
\def\figFileOrDummy#1{\IfFileExists
    {#1.eps}{#1}\dummypath}
\そうしないと
\def\figFileOrDummy#1{\IfFileExists
    {#1.pdf}{#1}{\IfFileExists
      {#1.jpg}{#1}{\IfFileExists
        {#1.png}{#1}\dummypath}}} %または、必要に応じて、より多くのグラフィック タイプを使用できます。
\fi
于 2010-05-18T12:40:32.840 に答える
2

さて、マクロの動作方法を再構築することにより、#2に対する可能な答えを見つけました(そして、チャールズ・スチュワートの答えからのいくつかの提案を使用するようなものです—見た目が好きではないことを認めます私は C/C++ の方法に慣れすぎているため、本当の LaTeX プログラマーにはなれません)。

とにかく、私の答えは...

マクロに渡すファイル名をマクロで生成しようとする代わりに、実際のファイル名またはダミー ファイル名\includegraphicsをラップして渡すマクロを作成します。これは、(引数として) 長いスクリプト/マクロを渡すことを回避しているようですが、このように記述しなければならない正当な理由\includegraphicsはわかりません。しかし、それは機能します...

% Dummy figure file
\def\dummyfigure{commands/dummy}%

% Includegraphics wrapper macro to include either dummy or real figure
\ifx\pdfoutput\undefined
\newcommand{\incgfx}[2]{%
    \def\testfile{\chapdir/fig/#2}%
    \IfFileExists{\testfile.eps}%
        {\includegraphics[#1]{\testfile}}% test file found
        {\includegraphics[#1]{\dummyfigure}}% test file not found
}
\else
\newcommand{\incgfx}[2]{%
    \def\figfilename{\dummyfigure}
    \def\testfile{\chapdir/fig/#2}
    \IfFileExists{\testfile.jpg}{\def\figfilename{\testfile}}{}
    \IfFileExists{\testfile.png}{\def\figfilename{\testfile}}{}
    \IfFileExists{\testfile.pdf}{\def\figfilename{\testfile}}{}
    \IfFileExists{\testfile.jpeg}{\def\figfilename{\testfile}}{}
    \IfFileExists{\testfile.tif}{\def\figfilename{\testfile}}{}
    \IfFileExists{\testfile.tiff}{\def\figfilename{\testfile}}{}
    \includegraphics[#1]{\figfilename}
}
\fi

これにより、意図したとおりに使用できます。

\begin{figure}
    \begin{center}
        \incgfx{height=3cm}{\chapdir/fig/fluxcapacitor}
        \caption{...}\label{fig:...}
    \end{center}
\end{figure}

繰り返しますが、既存の関数のラッパーを作成するのではなく、元のアイデアを機能させる方法があると思いますが、今のところこれで十分です...

于 2010-05-19T04:57:21.257 に答える
1

#3 への回答: この目的のために、todonotesパッケージが非常に便利だと思います。コードが提供しようとしているレベルの自動化は提供されませんが\missingfigure、不足している図にダミー ボックスを配置できる非常に優れたコマンドがあります。

于 2010-05-18T10:07:21.753 に答える