pdf ファイルの指定方法、includegraphics

pdf ファイルの指定方法、includegraphics

- 佐藤 禎宏 の投稿
返信数: 7
質問内容を説明するために test.tex を書きます。
\documentclass{jsarticle}
\usepackage[dvipdfmx,hiresbb]{graphicx}
\usepackage{amsmath,amssymb}
%\newcommand{\file}{lognmame.pdf}

\begin{document}

\begin{figure}[htbp]
  \begin{center}
\includegraphics[width=10cm]{./grf/a/longname.pdf}
     % \includegraphics[width=10cm]{./grf/a/\file}           % error
\end{center}
\caption{\textsf{/a/longname} }
\end{figure}

\begin{figure}[htbp]
  \begin{center}
\includegraphics[width=10cm]{./grf/b/longname.pdf}
\end{center}
\caption{\textsf{/b/longname }}
\end{figure}
\end{document}

2回 longname.pdf が現れます。(簡単にするため 2回にしています。)
この longname.pdf を短い file で置き換える方法をお尋ねします。
よくわからずに \newcommand{\file}{longname.pdf} で試みたのですがエラーでした。
シェルの場合、 file=longfile.pdf  をセットして、$file で使えます。
この機能を LaTeX で使えれば便利と思い質問した次第です。よろしくお願いします。
佐藤 禎宏 への返信

Re: pdf ファイルの指定方法、includegraphics

- 匿 名 の投稿
理由は分からないのですが,

    \newcommand{\file}{longname.pdf}



    \newcommand{\file}{longname}

としたら,手元ではうまくいきました.

なお,

    \graphicspath{{./grf/a/}}

を設定すれば,

    \newcommand{\file}{longname.pdf}
    \includegraphics[width=10cm]{\file}

でもうまくいきます(ただこのやり方ですと ./grf/b/ にも同名のファイルがある場合の使い分けは出来ませんが).
匿 名 への返信

Re: pdf ファイルの指定方法、includegraphics

- 本田 知亮 の投稿
>としたら,手元ではうまくいきました

はい,うまくいくと思います.

LaTeXのファイルサーチなんですが
マクロの引数のパターンマッチで実装されてます.

大雑把にはいかのような流れになります.

今回のようにマクロで\fileと与えられて
これが
hoge/\file
となると
じつは
「hoge/\file」というのが
ファイル名のベース(拡張子の前)と認識されてしまって
「hoge/\file」に
規定の拡張子(\Gin@extensionsというのに
一覧が格納されてます)をつけたものが探されます.
そして,探すときは\fileは展開されて
hoge/longname.pdf.pdf
というのが探されます.
これが存在しなければ
一覧の中の.pdfの次の拡張子のものをさがして・・・
となって,(みんな拡張子が二つあるものとなる)
最終的に発見できないので
「hoge/\fileがない」と表示されるのですが
表示される際に\fileが展開されるので
「hoge/longname.pdfがない」
となるのですが,これがあるんですよね(^-^;;


それで,拡張子なしにすると
hoge/\fileを探すところまでは同じで
「hoge/\file」もファイル名のベースになるんですが
これに拡張子をついかして探す際には
\fileが展開されて
「hoge/longname」となって
これなら(結果的に)正しくさがせるのです.

この動きは\filename@parseというマクロが
処理しているのですが,ちょっと
ad hocな細工をしてみました.
\filename@pathに渡すときに
すでに文字列になっていれば
(マクロが展開されていれば)いいだろう
というだけの細工で
複雑なマクロでファイル名を生成したらどうなるかは
わかりません.

あと,\filename@parseは
OSによる「pathの切れ目の文字」を
考慮しているので
以下のものは「/」が切れ目の文字になるOS用です.
ほかのケースはlatex.ltxの当該箇所をみてください.

\documentclass{jarticle}
\usepackage[dvipdfmx]{graphicx}

\def\file{tiger.pdf}
\makeatletter
\def\filename@parse#1{%
\edef\@reserved@a{#1}%
\let\filename@area\@empty
\expandafter\filename@path\@reserved@a/\\}
\def\filename@path#1/#2\\{%
\ifx\\#2\\%
\def\reserved@a{\filename@simple#1.\\}%
\else
\edef\filename@area{\filename@area#1/}%
\def\reserved@a{\filename@path#2\\}%
\fi
\reserved@a}

\makeatother
\begin{document}

\includegraphics{./xxx/\file}


\end{document}

本田 知亮 への返信

Re: pdf ファイルの指定方法、includegraphics

- 匿 名 の投稿
よく分かってもいないのに書き込んだ匿名です.

本田さん,ご説明をありがとうございます! とてもよく分かりました.

> \filename@pathに渡すときに
> すでに文字列になっていれば
> (マクロが展開されていれば)いいだろう
> というだけの細工で

なるほど,そうすればうまくいくのですね.

\filename@parseが\filename@pathを再帰的に使って“filename”を\filename@area,\filename@base,\filename@extへと切り分けていることなどもltdirchk.dtxを見て勉強になりました.
佐藤 禎宏 への返信

Re: pdf ファイルの指定方法、includegraphics

- 岩崎 隆盛 の投稿
TikZを使ってみては、どうでしょうか?
\pgfdeclareimage[ options ]{ image name }{ filename }

\includegraphicsの代わりに
\tikz{\pgftext{\pgfuseimage{image name}}}

岩崎 隆盛 への返信

Re: pdf ファイルの指定方法、includegraphics

- 岩崎 隆盛 の投稿
もう、解決済みなのでなんですが。。。
訂正します。
「\includegraphicsの代わりに
\tikz{\pgftext{\pgfuseimage{image name}}}」

「\includegraphicsの代わりに
\pgfuseimage{image name}」