tcolorbox + run pdflatex でサブディレクトリーにあるファイルを使いたい

tcolorbox + run pdflatex でサブディレクトリーにあるファイルを使いたい

- tori tori の投稿
返信数: 6

本投稿の最後に付けたファイルを以下のようなディレクトリー構成で保存したうえでコンパイル(pdflatex -shell-escape testtcb.tex)とするとエラーがでてコンパイルできないのですが、良い解決方法はあるでしょうか?

具体的には内部的に呼ばれるa/b/toBeIncluded.texのコンパイル結果が./toBeIncluded.pdfとして保存されるのですが、\mylistingでは./a/b/toBeIncluded.pdfを読み込もうとするので、

./testtcb.tex:26: Package tcolorbox Error: PDF file `a/b/toBeIncluded.pdf' not found.

とエラーになります。./toBeIncluded.pdf自体は問題なく生成されています。

  • ディレクトリー構成、a/b/*.texのファイル名、a/b/*.texの内容は変えずに解決できる方法でお願いします
  • pdflatexでの解決が望ましいですが、lualatexでも良いです
  • 本文、ファイル名ともに日本語は使わない前提でOKです
  • 必須ではないですがtoBeIncluded.pdf の場所はできればa/b/の中が望ましいです

よろしくお願いいたします。


% testtcb.tex
%
% Compile: pdflatex -shell-escape testtcb.tex

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[most]{tcolorbox}

\newtcbinputlisting{\mylisting}[2][]{%
listing file={#2},
title=\texttt{#2},
colback=red!5!white,colframe=red!75!black,fonttitle=\bfseries,
listing and comment,
pdf comment,
freeze pdf,
run pdflatex,
breakable,
#1}

\begin{document}
\mylisting{a/b/toBeIncluded.tex}
\end{document}

% a/b/toBeIncluded.tex
\documentclass{standalone}

\begin{document}
Hello World!
\end{document}
tori tori への返信

Re: tcolorbox + run pdflatex でサブディレクトリーにあるファイルを使いたい

- 和田 勇 の投稿

.pdf や中間ファイルを出力するディレクトリを指定しては如何でしょうか?

具体的にはマニュアルで pdflatex -output-directory=a/b a/b/toBeIncluded.tex として a/b の 配下に a/b/toBeIncluded.pdf が作成できますので ....

とりあえず run pdflatex,run pdflatex = {-output-directory=a/b #2}, としては処理できますので、サブディレクトリ情報もマクロパラメータで指定されては如何でしょうか。

和田 勇 への返信

Re: tcolorbox + run pdflatex でサブディレクトリーにあるファイルを使いたい

- 和田 勇 の投稿

補足(訂正)

run pdflatex = {-output-directory=a/b #2}, ではなく run pdflatex = {-output-directory=a/b}, で良いようです。

和田 勇 への返信

Re: tcolorbox + run pdflatex でサブディレクトリーにあるファイルを使いたい

- tori tori の投稿

私の説明が不足していたのですが、a/b/以外のディレクトリーにもファイルがあり\foreachで処理させたかったので提案していただいた方法そのままでは不都合がありました。 しかし-output-directoryというヒントのおかげで以下で解決できました。 (より良い書き方などあればご指摘いただけると嬉しいです) ありがとうございました。

\makeatletter
\newtcbinputlisting{\@mylisting}[3][]{%
  listing file={#2#3},
  title=\texttt{#3},
  colback=red!5!white,colframe=red!75!black,fonttitle=\bfseries,
  listing and comment,
  pdf comment,
  freeze pdf,
  run pdflatex={-output-directory=#2},
  breakable,
  #1
}

\newcommand{\mylisting}[2][]{
  \filename@parse{#2}
  \edef\d{\filename@area}
  \edef\f{\filename@base}
  \@mylisting[#1]{\d}{\f}}
\makeatother

\foreach \f in {a/b/c.tex,a/c/d.tex}{\mylisting{\f}}
tori tori への返信

Re: tcolorbox + run pdflatex でサブディレクトリーにあるファイルを使いたい

- 和田 勇 の投稿

title=\texttt{#3} だと、c とかd になって拡張子 .tex 情報が欠落してしまうのがきになります。

またlisting file={#2#3} はどこに反映されるか調べていませんが / が抜けて、 a/bc や a/cd になってしまいます。 ` なので \@mylisting[#1]{\filename@area}{\filename@base.\filename@ext} とかかな。

また危惧ではありますが、カレントディレクトリの filename.tex を扱う場合、 \mylisting{./filename.tex} とした方が良いようです。

\mylisting{filename.tex} だと \filename@area には \relax が入り run pdflatex={-output-directory=#2} を解釈するときは run pdflatex={-output-directory=\relax} になってしま雨と思います。 そのため、filename.log を書き出すことができないようになるようですので。

和田 勇 への返信

Re: tcolorbox + run pdflatex でサブディレクトリーにあるファイルを使いたい

- tori tori の投稿

コメントありがとうございます。

title=\texttt{#3} だと、c とかd になって拡張子 .tex 情報が欠落してしまうのがきになります。

今回はこちらの方が都合が良かったのでこのようにしました。 また下と関連しますが\mylistingで拡張子があったりなかったりした場合を考えるとむしろ統一できて良いと思っています。

またlisting file={#2#3} はどこに反映されるか調べていませんが / が抜けて、 a/bc や a/cd になってしまいます。

私の環境(Linux)では\filename@areaは必ず/で終わるのでa/bcとはなりません。

なので \@mylisting[#1]{\filename@area}{\filename@base.\filename@ext} とかかな。

\@mylisting[#1]{\d}{\f}}

\@mylisting[#1]{\filename@area}{\filename@base.\filename@ext}

に変えるとコンパイルできません。(無限ループになっている?)

\edef\e{\filename@ext}
\@mylisting[#1]{\d}{\f.\e}

としても拡張子なしで\mylisting{a/filename}とするとうまくいきません。

また危惧ではありますが、カレントディレクトリの filename.tex を扱う場合、 \mylisting{./filename.tex} とした方が良いようです。 \mylisting{filename.tex} だと \filename@area には \relax が入り run pdflatex={-output-directory=#2} を解釈するときは run pdflatex={-output-directory=\relax} になってしま雨と思います。 そのため、filename.log を書き出すことができないようになるようですので。

これはご指摘の通りです。 今回は取り込まれるファイルは全てa/にあったので問題になりませんでしたが、カレントディレクトリーのファイルも取り込みたい場合はまずいですね。 ただコメントしていただいた通りの回避策はありますので私としては許容できます。

tori tori への返信

Re: tcolorbox + run pdflatex でサブディレクトリーにあるファイルを使いたい

- 和田 勇 の投稿

不明なところがあるのですが、誤った情報の訂正を含めての報告です。

  • \filename@areaは必ず / で終わる

    デバッグ文を挿入して確認したはずなのに、見落としていました。

  • \@mylisting[#1]{\filename@area}{\filename@base.\filename@ext}無限ループ

    再現します。原因はわかりません。

  • \mylisting{a/filename}NG

    これも再現しました。\filename@ext\relax にもなっていないようです。

    またループ状態に陥ります。

  • デバッグ

    以下のようなデバッグコードで改めて検証してみました。

    \newcommand{\mylisting}[2][]{
      \typeout{DEBUG --------------------}
      \typeout{DEBUG 第2引数[#2] filename@parse前}% \filename@base の前後で #2 が変化する
      %%%
      \filename@parse{#2}    \typeout{DEBUG 第2引数[#2] filename@parse後}
      \edef\d{\filename@area}\typeout{DEBUG 第2引数[#2] filename@area後}
      \edef\f{\filename@base}\typeout{DEBUG 第2引数[#2] filename@base後}
      \edef\e{\filename@ext} \typeout{DEBUG 第2引数[#2] filename@ext後}% @ext を先に実行しても @base で変化
      %%%
      \typeout{DEBUG area=[\filename@area][\d]}
      \typeout{DEBUG base=[\filename@base][\f]}
      \typeout{DEBUG  ext=[\filename@ext][\e]}
      \typeout{DEBUG @ @ @ mylisting[#1]{\filename@area}{\filename@base.\filename@ext}}
      \typeout{DEBUG f b e mylisting[#1]{\d}{\f.\e}}
      \typeout{DEBUG --------------------}
      %%%
      \\@mylisting[#1]{\d}{\f.\e}% OK
      % \\@mylisting[#1]{\filename@area}{\filename@base.\filename@ext}% NG
    }
    

 検証に用いたソースも念の為添付します。

 a/b/c.tex や ./e.tex 添付していませんので pdflatex での処理可能なものを利用してください。