2020年2月9日

importパッケージ

次のようなディレクトリ構成

  • main.tex
  • dir(ディレクトリ)
    • sub.tex
    • graph.tex
において,main.texから\input{dir/sub.tex}とsub.texを読み込み,さらにsub.texから\input{graph.tex}とgraph.texを読み込もうとしても失敗する.\inputの引数はmain.texからの相対パスによる指定でなければならないためである.importパッケージはこれを解決するLaTeXパッケージである.

そもそもファイル分割を殆どしないので,こういうのが必要になることもないんだけど,今日たまたま必要になったので.こんなんがあった気がするーと思って探す羽目になったので,今後の備忘録として.

使い方

パッケージオプションはないので,通常通り

\usepackage{import}
として読み込みます.その後,main.texからのsub.texの読み込みを
\subinputfrom{dir/}{sub.tex}
と変更すれば,sub.texからgraph.texを読み込むことができるようになります.これは\inputの代わりですが,\includeの代わりには\subincludefromがあります.例から自明ですが,使い方は
\subinputfrom{<ディレクトリ名>}{<ファイル名>}
で,これで<ディレクトリ名><ファイル名>を読み込みます.<ディレクトリ名>の最後に/を付け忘れがちなので注意.

\subinputfromの第一引数は現在のファイルからの相対パスですが,絶対パスを指定したい場合は\inputfromを使います.例えば

\inputfrom{C:/Users/abenori/dir/}{sub.tex}
のようにします.\includeバージョンも同様です.

*版

次のように親ファイルと同じディレクトリおよりサブディレクトリに同じ名前があるとします.

  • main.tex
  • a.tex
  • dir(ディレクトリ)
    • a.tex
すると,main.tex内で
\subinputfrom{dir/}{a.tex} % main.texと同じファイル内のa.texが読まれる
% \input{dir/a.tex}% これならばdir以下のa.texが読まれる
としても,\subinputfromは親ファイルと同じディレクトリにあるa.texを読んでしまいます.
\subinputfrom*{dir/}{a.tex}
% \subinputfrom{dir/}{dir/a.tex} % これでもdir/a.texが読まれる
*付きで実行すると,dir以下のa.texが読み込まれます.なお,実際に*付きが行うのは,検索パスからTEXINPUTSを外すことです.

細かい話

実際のファイル名解決は次のようになっているようです.importパッケージは\import@pathに現在のファイルのディレクトリを保存しています.\subinputfrom{dir/}{sub.tex}が行われると,この\import@pathにdir/をくっつけてLaTeXの検索パスに入れて\input{sub.tex}を実行します.subのつかない\inputfrom{dir/}{sub.tex}の場合は一度\import@pathを空にしてから上の処理を実行します.

というわけで最終的には\inputが実行されるので,上で絶対パスとか言っているのは実際には親ファイルからの相対パスでもよかったりします.それと,途中で生の\inputが入ると,そこでは\import@pathの更新が行われないので,\inputされたファイル内では\inputしたファイルからの相対的なパスでの指定をすることになります.などなど.

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です