相対パスで独自の LaTeX テンプレートを作成する、include、input、class の違い

相対パスで独自の LaTeX テンプレートを作成する、include、input、class の違い

私は Miktex を使って Windows 環境で作業しています。ほとんどのドキュメントは XeLaTeX で作成されていますが、問題はコンパイラ固有のものではないと思います。

すべてのパッケージ インクルード、ヘッダー設定、グラフィック パス (例: ヘッダー ロゴを含める) を含むテンプレートを作成したいと思います。テンプレートを使用するすべてのドキュメントでは、ドキュメント固有の設定とドキュメント コンテンツのみを使用します。問題は、ドキュメントがテンプレートとは異なるフォルダーにある可能性があるにもかかわらず、テンプレート フォルダーから画像を含めたいことです。私の設定は次のようになります。

.
├── templates/
│   ├── my_template.tex
│   └── pictures/
│       └── header_logo.pdf
└── documents/
    ├── my_document.tex
    └── pictures/
        └── some_picture.png

最小限の例としては、次のものが挙げられます。

my_template.tex:

\documentclass[
    11pt,
    a4paper,
]{scrarticle}

\usepackage{scrextend}
\usepackage{scrlayer-scrpage}

%%%%% Graphics %%%%%
\usepackage{graphicx}
\graphicspath{{./pictures/}}

%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}

my_document.tex:

\input{../templates/my_template.tex}

\graphicspath{{./pictures/}}

\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}

私の質問は、この作業を実現するための標準的な方法は何ですか?この質問非常に役に立ちますが、どれが適切かを判断するには、さまざまなアプローチについてもう少し詳しく知る必要があります。このコンテキストでの と の違いや、テンプレートをクラスに変換する必要があるかどうかを完全に理解していませincludeinput

答え1

例えばhttps://tex.stackexchange.com/a/250/162943は、\inputファイルの内容を再入力し、と をincludes追加しますclearpages。ネストすることはできません。 を使用します\input
コマンドは\graphicspath、フォルダーのリストを引数として受け取ります:\graphcispath{{folder1}{folder2}}なので、テンプレート イメージ フォルダーの完全パス (templates/pictures) とドキュメント イメージ フォルダーの相対パス (documents/pictures) を使用することをお勧めします。これらは常に同じ名前になると思います。

my_template.tex:

\documentclass[
    11pt,
    a4paper,
]{scrarticle}

\usepackage{scrextend}
\usepackage{scrlayer-scrpage}

%%%%% Graphics %%%%%
\usepackage{graphicx}
\graphicspath{{C:/Path/to/template/image/folder}{./pictures/}}

%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}

my_document.tex:

\input{../templates/my_template.tex}

\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}

別の解決策としては、シンボリック リンクを使用することです。プロジェクトのイメージ フォルダー内にテンプレート イメージ フォルダーのシンボリック リンクを作成し、 のみを使用します\graphicspath{{./pictures/}}。この場合、各 にフォルダーの名前を追加することを忘れないようにしてくださいincludegraphics

答え2

絶対パスを避けるには、subfilesパッケージを使用できます (主な使用例は少し異なりますが)。必要な変更は次のとおりです。

  • を追加して、テンプレートを完全なドキュメントにします\begin{document}\end{document}

  • テンプレートのプリアンブルの最後でパッケージをロードしsubfiles、その後グラフィック パスを設定しますが、相対パスを使用して、テンプレートに関連する画像ディレクトリのみを参照するようにします。

  • 実際の文書は次の行から始めます

    \documentclass[rel.path to template]{subfiles}
    
  • 実際のドキュメントのプリアンブルで、グラフィック パスにさらにローカル画像ディレクトリを追加します。

他のソリューションに比べて優れている点は、テンプレートはテンプレートに関連する画像ディレクトリのみを知る必要があり、ドキュメントは特定の画像を同じディレクトリに保存する必要がないことです。また、絶対パスも必要ありません。

たとえば、これらの変更は次のようになります。

% templates/my_template.tex
\documentclass[
    11pt,
    a4paper,
]{scrarticle}

\usepackage{scrextend}
\usepackage{scrlayer-scrpage}

%%%%% Graphics %%%%%
\usepackage{graphicx}
\usepackage{subfiles}
\graphicspath{{./pictures/}}% <<< PICTURES LOCAL TO template DIRECTORY

%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}
\begin{document}% <<< NECESSARY FOR subfiles TO WORK
\end{document}% <<< NECESSARY FOR subfiles TO WORK

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% documents/my_document.tex
\documentclass[../templates/my_template]{subfiles}% <<< LOAD PREAMBLE FROM ../templates/my_template.tex

\makeatletter% <<< EXTEND THE GRAPHICS SEARCH PATH BY LOCAL DIRECTORIES
\edef\Ginput@path{\Ginput@path{./pictures/}}% <<<<<<<<<<<<<<<<<
\makeatother% <<<<<<<<<<<<<<<<<

\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}

答え3

他の回答の 1 つで述べたように、\input別のファイルからテキストを、手動で結合したかのように直接コピーします。これは通常、最も簡単な方法であり、大きなドキュメントの場合はネストできます。\includeコンテンツを配置するための新しいページが常に作成され、ネストすることはできません。

を使用する利点\includeは、ドキュメントの先頭で\includeonlyファイル名のリストとともに を使用でき、異なるファイル名を指定するインクルードは無視されることです。私は、メイン セクションが を使用する非常に大規模なプロジェクトでこれを使用しました。これにより、セクション\includeの 1 つで作業しているときに、他のセクションがコンパイルされるのを待つ必要がなくなりました。 を\inputネストすることはできないため、サブセクションには を使用しました\include。セクションを入力してサブセクションをインクルードすることで、逆の方法で行うこともできます。

プリアンブルを別のファイルに置くことは非常に一般的です。これを行うには、他の方法よりも多少正しい方法がいくつかあります。これを行う最も一般的な方法は、プリアンブル ( 以外\documentclass) を別のファイルに置くことです。このファイルは、たとえば という任意の名前にすることができます。ただしmypreamble.sty、 で終わる必要があることに注意してください。.styその後は、他のパッケージと同様にできます。プリアンブル ファイルの先頭に\usepackage{mypreamble}行を追加する必要があります。 を使用して行うこともできますが、は内部処理を行い、オプションのパラメータなどを許可するため、推奨されません。\ProvidesPackage{mypreabmle}\include\usepackage

複数のファイルに役立つ他のパッケージの 1 つは、importというコマンドを使用することで、次のように使用できます。\import{path\to\secton}{sectionname.tex}これの優れた点は、すでにインポートしたファイル内の何かをインポートする場合、インポートしたファイルへの相対パスを使用して を呼び出すことができることです\subimport{relitive/path/}{plot1.tex}。これは非常に便利です。

答え4

gernot と bryce の回答により、実際にファイルにプリアンブルを入れてみることにしました.cls。いくつかのファイルを再配置する必要があり、ファイル ツリーは次のようになりました。

.
├── templates/
│   └── tex/
│       └── latex/
│           └── my_template/
│               ├── my_template.cls
│               └── header_logo.pdf
└── documents/
    ├── my_document.tex
    └── pictures/
        └── some_picture.png

my_template.clsは次のように変わります

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{my_template}
\LoadClass[
    11pt,
    a4paper,
]{scrarticle}

\RequirePackage{scrextend}
\RequirePackage{scrlayer-scrpage}

%%%%% Graphics %%%%%
\RequirePackage{graphicx}
\graphicspath{{./pictures/}}

%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}

そしてmy_document.texは

\documentclass{my_template}

\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}

内部の graphicspath はmy_template.clsファイルに対して相対的になりmy_document.tex、cls は独自の場所からグラフィックスを直接取得します。動作させるには、templatesディレクトリを独自の texmf ルートとして初期化する必要があります (私は を使用してこれを行いましたMiktex console --> Settings --> Directories --> Add)。この設定の利点は、テンプレートが存在するディレクトリへの相対パスまたは絶対パスを指定する必要がなく、PC 上のどこからでもテンプレートを使用できることです。これは、GIT バージョン管理の面で非常に役立ちます。

このアプローチに関するさらにいくつかの回答と、たとえば可搬型インストールに関する詳細は、こちらに記載されています。

すべての .tex ファイルで使用できるようにするには、独自の .sty または .cls ファイルをどこに配置すればよいですか?

.sty および .cls ファイルだけでなく、.pdf または .eps 形式のロゴもバンドルする LaTeX パッケージを作成するにはどうすればよいでしょうか?

特にこれデフォルトパスの回答。

関連情報