xelatex でクリッピングするときの測定単位 px が不正です (pdflatex ではそうではありません)

xelatex でクリッピングするときの測定単位 px が不正です (pdflatex ではそうではありません)

ドキュメントをpdflatex(Ubuntu 上)でコンパイルすると、正常に動作します。他のいくつかの問題のために に切り替えていましたxelatexが、次のコードはコンパイルされなくなりました。

\includegraphics[clip, trim={50px 50px 100px 100px}, width=\textwidth, height=\textwidth]{./images/image1.png}

人々が遊べる MWE は次のとおりです:

\documentclass{article}
\usepackage{graphicx}
\usepackage{mwe}
\begin{document}
\includegraphics[clip, trim={10px 40px 10px 40px}, width=\textwidth, height=\textwidth]{example-grid-100x100pt.png}
\end{document}

エラー:

Illegal unit of measure (pt inserted).

pxは LaTeX では非標準の単位であることはわかっていますが、含まれているグラフィックは PNG であり、これは本質的にピクセル単位で測定されるため、特定のピクセル数でトリミングする必要があります。これは で問題なく機能し、理にかなっています。(PNG に非標準の dpi がある場合はでpdflatex変更できると思いますが、メタデータを読み取ってこれを自分で実行できないのはなぜか理解できません)。px\pdfpxdimen

特定のピクセル数で画像をトリミングするにはどうすればいいですかxelatex?

編集: ここでは、画像の組み込み方法にできるだけ変更を加えずに回避策を試みました (これにより、私が何をしようとしているのかが明確になると思います)。

  1. 画像の dpi を取得します。たとえば、image magick では次のようになります: identify -format "%w x %h %x x %y" images/image1.png出力:161 x 161 72 x 72つまり、画像は 161x161 ピクセルで、dpi は両方の次元で 72 です。(LaTeX は画像の実際の dpi を使用するのでしょうか? それとも、デフォルトの 72 を前提としているのでしょうか?)
  2. ラテックスが理解できる単位でピクセルの長さを計算する:1ピクセル= 1/72インチ= .0388(ちなみに、1ピクセル= 1bp)この場合したがって、ここで px を bp に置き換えることもできますが、これは一般的な解決策ではありません。
  3. 適切な値で長さを定義し\mypxpxに切り替えます\mypx
%72 dpi -> 1 px = 1/72 in = .013889
\newlength{\mypx}
\setlength{\mypx}{0.013889in}
\includegraphics[clip, trim={50\mypx 50\mypx 100\mypx 100\mypx}, width=\textwidth, height=\textwidth]{./images/data041_arrIm_image_1.png}

残念ながら、これは機能しません。長さはクリップ パラメータとして使用できないようです。ピクセルを単位として使用することが私にとって重要です (「単位」という単語の英語の意味で、LaTeX の定義ではありません)。毎回、pt、in などで同等のトリム値を手動で計算したくありません。「13 ピクセルを削除」と指定して、画像から正確に 13 ピクセルを削除する必要があります。必要なトリミングが異なる画像が多数あり、トリミングでは特定の整数のピクセルを削除する必要があります。

なぜLaTeXではこれが難しいのか、いまだに理解できません。ラスターイメージを組み込むことができるということは、である必要がありますある程度ピクセルを認識している必要があります (そうでなければ表示できません)。そのため、長さではなくピクセル単位で直接トリミングできるはずです。

答え1

例のように、\newlengthのパラメータで を使用して定義された長さを使用する場合は、TeX の解析ルールに注意する必要があります。trim=\mypx

\includegraphics[clip, trim={10\mypx 40\mypx 10\mypx 40\mypx}, width=\textwidth, height=\textwidth]{example-grid-100x100pt.png}

制御シーケンスの後のスペースは\mypx通常のスペースではなく制御シーケンスの区切り文字として使用されるので、引数を区切るのに使用することはできませんtrim。したがって、基本的に上記の行は次の行と同じです。

\includegraphics[clip, trim={10\mypx40\mypx10\mypx40\mypx}, width=\textwidth, height=\textwidth]{example-grid-100x100pt.png}

これは明らかにうまくいきません。各次元を括弧で囲むことでこれを回避できます。

\documentclass{article}
\usepackage{graphicx}
\usepackage{mwe}
\newlength{\mypx}
\setlength{\mypx}{0.013889in}
\begin{document}
\includegraphics[clip, trim={{10\mypx} {40\mypx} {10\mypx} {40\mypx}}, width=\textwidth, height=\textwidth]{example-grid-100x100pt.png}
\end{document}

関連情報