2014年6月20日金曜日

複数の文書で共通して使いたい文書の置き場所(LaTeX)

LaTeXでLebesgue積分のノートと複素解析のノート,Lie群のノートを作成しているのですが,実数関数についての微積分の内容をすべてのノートに共通させたいと以前から考えていました.

サブフォルダに置いてある文章ならば,import.styを使って読み込むことも可能ですが,同水準のフォルダ間の文章の読み込みは望みの挙動をしてくれる解決策を知りませんでした.
import.styを使うと,サブディレクトリ以外の他ディレクトリのファイルも読み込むことが可能なようです.しかし私が試した限りでは,警告やエラーが出ないものの,期待したファイルを読み込んでいない結果が得られました.またimport.styを使うと,YaTeX側で認識をしてくれないという問題があります(個人的にはこれが一番の問題).


仮に共有したい微積分のノートが「$HOME/notes/calculus」に置いてあるとします.

  • \inputコマンドを使うのであれば,これは相対パスを理解してくれるようなので,\input{../calculus/integral}といった記述をしても問題なくタイプセットを行うことが可能です.

しかし\includeコマンドを使おうと思うと,相対パス表記はLaTeX側で解釈してもらえないようで,エラーが出てしまいます.大規模の文章を扱うときには,\includeonlyコマンドを使って分割タイプセットを行いたいので,\inputしか使えないのは不満が残ります.

  • 別の解決策として1つのPC(OS)しか使わないのであれば,共通させたい文書を入れるフォルダを作って,その他の各文書のフォルダにはシンボリックリンクを貼っておけば良さそうです.
しかしこれにも問題点があって,私はLaTeXのノートをDropboxに保存して複数のPCで共有しているのですが,シンボリックリンクを使った方法だとDropbox上で実ファイルとして認識されてしまうようで,他のPCでは実ファイル化してしまい余計に扱いがややこしくなりました.

現在はMacやLinuxの環境では
  • ~/.bashrcなどに変数TEXINPUTSを
    export TEXINPUTS=$HOME/notes/calculus:$TEXINPUTS
    と記述してTeX側から共有したいファイルの場所が見えるようにする.
という解決策に落ち着きそうです.この方法だと,\include{integral}といった形で読みこめばよく,また\includeonlyコマンドも用いることができます.多くのディレクトリを追加すると,同じファイル名のものがあるときにかなりまずいことが起こりそうな予感がするので,ファイル名には慎重になる必要がありそうです.

YaTeXでincludeonlyの自動補完機能を使うとフルパスを記述されてしまうので,その点がなんとかならないかなとは思いますが,大分やりたいことに近づいたと思います.


2014/06/28:追記: TEXINPUTSを書き換える方法では,上記のように書き換えた場合,$HOME/notes/calculus内にauxファイルがあると,mainファイルに作成されたauxファイルよりもそちらを先に読みにいってしまうため,目次や式番号などが正しく作成されません.共有する文書を入れたディレクトリ内からはauxファイルを削除しておくようにしましょう.

他にも色々な解決法があるようです.
のあたりが参考になります.
\let\include=\inputとするものや,texmf.cnfの中のopenout_any, openin_anyという変数をa (any)にするものもありました.後者はカレントディレクトリの上位ディレクトリの読み書きを許すことになるので,セキュリティー上よろしくないようです.野良TeXファイルをタイプセットしないのであればこれでよいのかも.