ラテックス埋め込みグラフィックス| JavaのAPI
画像を含める別の方法
一部のTEX/LATEXシステムにより、LaTexファイル自体に対して外部から保存されていない画像を含めることができます。代わりに、これらの画像はラテックスファイルに直接埋め込まれています。ただし、Tex/LaTexファイルはプレーンテキストであり、バイナリデータを含めることはできないため、テキスト形式でバイナリデータを表す方法が必要です。これは、バイナリデータをテキスト表現にエンコードする必要があることを意味します。課題は、TEXエンジンがこれらのエンコードされた画像を直接解釈できないことです。最終的に、graphicx
パッケージからよく知られている\includegraphics
コマンドを使用して画像が含まれていますが、このコマンドは外部画像ファイルの処理に限定されています。したがって、外部画像ファイル(追加の仲介ファイルとともに)は、LaTexファイルの外側でまだ作成する必要がありますが、それは版形セット中にのみ発生します。利点は、ファイルのセットではなく、LaTexファイル自体を配布するだけであることです。
さて、ラテックスファイルにエンコードされた画像を何らかの形で埋め込んだとします。この画像をどのようにデコードしますか?残念ながら、LaTexファイルから読み取り、外部画像ファイルに書き込むことで、直接デコードすることはできません。代わりに、エンコードされた画像を表すテキスト文字列は、最初に外部テキストファイルに書き込まれ、次に画像ファイルを生成するためにデコードできます。
この時点で、次の手順を概説して、望ましい結果を達成できます。
- 画像をエンコードします。
- 画像データを表すテキスト文字列をLaTexファイルに挿入します。
- 画像データを表すテキスト文字列を外部ファイルに書き込みます。
- ステップ3で作成された外部ファイルをデコードします。
- デコードされた画像を含めます。
最初の2つの手順は、LaTexファイルの著者によって実行されます。もちろん、TEXエンジンは、適切に指示されている限り、残りの手順を処理します。
ステップ1に進みましょう。画像をエンコードして、文字列の文字列を取得するにはどうすればよいですか?これを行う方法の1つ(そしておそらく最も人気のある)はbase64です。
Base64を使用してバイナリデータをエンコードします
base64は、64の一意の文字のセットを使用して、バイナリデータを印刷可能な文字のシーケンスに変換するバイナリ間エンコードスキームのグループです。具体的には、ソースバイナリデータは6ビットのグループで処理され、各グループは64の一意の文字のいずれかにマッピングされます。すべてのバイナリ間エンコーディングスキームと同様に、Base64は、テキストコンテンツを主にサポートするチャネル上でバイナリ形式で保存されたデータの送信を促進することを目的としています。
この簡単な説明は、base64がまさに必要なものであることを示しています。画像ファイルをbase64にエンコードするには、コマンドラインユーティリティ(オペレーティングシステムで利用可能な場合)、ほぼすべてのプログラミング言語の標準またはサードパーティの機能、または base64.guruなどのオンラインツールを使用できます。
エンコードされた画像をLaTexファイルに埋め込みます
エンコーディングプロセスから生成された文字列は、次のように、ラテックスファイルの前文内の標準のラテックス「filecontents*`環境に配置する必要があります。
1\documentclass{article}
2\begin{filecontents*}[overwrite]{sample-image.64}
3iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
4\end{filecontents*}
5\begin{document}
6...
7\end{document}
ここにあります! ステップ2が完了しました。ラテックスファイル内に画像を正常に埋め込んでいます!しかし、このファイルの版画をラテックスで実行するとどうなりますか?」 LaTexプロセッサは、環境から「Sample-Image.64」という名前の外部ファイルに一連の文字列を書き込みます。 「上書き」オプションのため、ファイルは既に存在する場合に上書きされます(たとえば、前の実行中に作成された場合)。これがステップ3も達成される方法です!
base64文字列のデコード
私たちの計画のステップ4は、TEX実装の違いが発生する場所です。 base64文字列のデコードは、 \ write18
機能として知られるより一般的なものによって実行されます。
\ write18
古典的なTexエンジンでは、 \ write <number>(<token list>)
は、トークンのリストを書くために使用される原始です *。使用すると、この原始の後に整数が続きます。整数が負の場合、トークンはトランスクリプト(log)ファイルに書き込まれます。整数が「15」より大きい場合、トークンは端子に送信されます。整数が 0..15
の範囲内に収まる場合、トークンは、\ openout
プリミティブの前の発生によって名前が指定されているファイルに書き込まれます。 \ openout <4-Bit integer> = <ファイル名>
プリミティブは、ファイル名を数字に関連付けます。
PDF Texなどの新しいTex実装では、 \ write18
を使用できます。この場合、オペレーティングシステムシェルで実行されるコマンドラインとして<token list>
を解釈します。この機能は明らかに潜在的なセキュリティリスクをもたらすため、Tex関連のドキュメントやインターネットで参照されるたびに、ミステリーのヒントを感じるかもしれません。このため、PDF TEX/LATEX実行可能ファイルは、この機能にACESSを制御するコマンドオプションを提供します。
通常、アクセシビリティには3つのレベルのアクセシビリティがあります。無効化、制限により有効になり、完全に有効になっています。
asops.texでは、shellmode
と呼ばれるTexジョブオプションがあります。これは、shellestricted
とshellestricted
という2つの可能な値のいずれかをとることができます。 noshellescape
値は、機能が無効になっていることを示します。後者の値は、実行を必要とするコマンドが「実行可能可能」クラスの拡張機能としてユーザーが実装する必要があることを意味します。ここでは、このような実装の詳細については説明しませんが、 base64
コマンドエミュレーションは既にAsoppes.texに実装されており、デフォルトではTexoptions
クラスインスタンスの「実行可能ファイル」コレクションプロパティに含まれていることに注意することが重要です。
Base64エンコードデータのデコード
Base64エンコードされたデータを含むと予想されるファイルの内容をデコードするには、通常、次のコマンドラインを使用します。
1base64 -d FILE1 > FILE2
ここで、file1は「エンコードされた」ファイルであり、 > file2
は出力をファイル file2
にリダイレクトします。
したがって、ラテックスファイルの本文に次の行を含める必要があります。
1\immediate\write18{base64 -d sample-image.64 > sample-image.png}
\immediate
プレフィックスは、TeX スキャナがこのプリミティブに遭遇した際に\write
操作が直ちに実行されるようにするために必要です。そうでない場合、ページ出力時に処理されます。
ファイルの版画を今すぐ実行すると、画像ファイル「sample-image.png」が作成されていることがわかります。先に進んで、視聴者で開いてチェックしてください!
デコードされた画像を含む
記事の冒頭で述べたように、デコードされた画像を含めるには、よく知られているLaTexコマンド「\ includegraphics」を使用します。
1\includegraphics[options]{sample-image.png}
したがって、完全な(ほぼ)ラテックスファイルが次のように表示される場合があります。
1\documentclass{article}
2\begin{filecontents*}[overwrite]{sample-image.64}
3iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
4\end{filecontents*}
5\begin{document}
6 \write18{base64 -d sample-image.64 > sample-image.png}
7 \includegraphics[options]{sample-image.png}
8\end{document}
そして、Aspose.TeX APIを使用しているJavaコードは、シェルモードオプションを指定することを除き、他の記事で見つけることができるものに似ています。
1// Create conversion options for Object LaTeX format upon Object TeX engine extension.
2TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectLaTeX());
3// Specify a file system working directory for the output.
4options.setOutputWorkingDirectory(new OutputFileSystemDirectory(Utils.getOutputDirectory()));
5// Initialize the options for saving in PDF format.
6options.setSaveOptions(new PdfSaveOptions());
7// Enable the shell command execution.
8options.setShellMode(ShellMode.ShellRestricted);
9// Run LaTeX to PDF conversion.
10new TeXJob(Utils.getInputDirectory() + "embedded-base64-image.tex", new PdfDevice(), options).run();
そして今ステップ5が完了しました。本当に包括的な例については、 プロジェクトの例をご覧ください。
.NET APIのasops.texに基づいて構築された無料変換 Webアプリをチェックアウトすることもできます。