次のスクリプトは、.tex
ディレクトリ内のサフィックスを含むファイル(TeXファイルなど)を検索し、\RequireLuaTeX
そのディレクトリ内の文字列(LuaTeXファイルなど)を検索し、結果に基づいてBash配列を作成します。
latexmk
次に、配列内のファイルに対してコマンドを実行します。
配列として宣言できるカスタムファイルのリストをこの配列から除外したいと思います。
excludedfiles=(foo.tex bar.tex baz.tex)
きちんとしたアプローチについてのアドバイスを求めたいと思います。
私はすべてを配列に入れる方法が本当に好きです。まず、コマンドを実行する前にファイルのリストを簡単に一覧表示できます。しかし、私は他のアプローチも考えてみたいと思います。
#!/bin/bash
## Get LuaTeX filenames
mapfile -t -d "" filenames < <(grep -Z -rL "\RequireLuaTeX" *.tex)
## Run `latexmk` on PDFTeX files.
for filename in "${filenames[@]}"
do
base="${filename%.*}"
rm -f "$base".pdf
latexmk -pdf -shell-escape -interaction=nonstopmode "$base".tex
done
背景と説明:
TeXユーザーは私の質問に混乱する可能性があります。それで、ここで私がやろうとしていることと質問をどのように誤って書いたかを説明します。変更すると既存の回答が無効になり、混乱が生じる可能性があるので変更しません。
LaTeXファイルセットがあります。以前のバージョンはPDFLaTeXを使用していました。最新バージョンはほとんどPDFLaTeXを使用しています。 PDFLaTeXに関する質問です。私がスクリプトでやりたいことは
a) PDFLaTeX ファイルのリストを作成します。私のLuaLaTeXファイルには「\RequireLuaTeX」文字列が含まれています。したがって、この文字列を含まないファイルはPDFLaTeXファイルです。
そのため、文字列 "\RequireLuaTeX"を含まないLaTeXファイルのリストを作成しようとしています。
b)を使用してPDFLaTeXを実行しますlatexmk
。
私の質問には次のエラーがあります。私は書いた:
次のスクリプトは、
.tex
ディレクトリ内のサフィックスを含むファイル(TeXファイルなど)を検索し、\RequireLuaTeX
そのディレクトリ内の文字列(LuaTeXファイルなど)を検索し、結果に基づいてBash配列を作成します。
実際、私はこの文字列を含まないファイルが欲しいです。上記のように、これらのファイルは私のPDFLaTeXファイルに対応しているからです。
ベストアンサー1
-L
パターンと一致しない Grep ファイルのリストを表示します。あなたは代わりに欲しいです-l
。さらに、Grepは単一のバックスラッシュと一致するようにデュアルバックスラッシュを確認する必要があります。
それではBashを使っているので、いくつかの便利な設定を習得しましょう。
#!/bin/bash -
shopt -s globstar extglob
mapfile -t -d "" filenames < <(grep -Zl '\\RequireLuaTeX' ./**/!(foo|bar|baz).tex)
rm -f "${filenames[@]/%.tex/.pdf}"
latexmk -pdf -shell-escape -interaction=nonstopmode "${filenames[@]}"
**/!(foo|bar|baz).tex
現在のディレクトリツリーでは、orで終わりますが、.tex
デフォルト名ではないすべてのファイルに展開されますfoo.tex
。両方bar.tex
baz.tex
globstar
そしてextglob
これに必要です。"${filenames[@]/%.tex/.pdf}"
配列内のすべての要素に展開され、各要素を置き換えます。続く.tex
合格.pdf
。
Latexmkは複数のファイルをパラメータとして提供できるため、forループをスキップできます。