LaTeX typesetting as a programming language

LaTeX は文書をタイプセットするシステムで、What-You-See Is What-You-Get の概念を従来のプログラミング言語からの標準アイデアで置き換えています。 Mark Harmanはこの継承の力を実証しています。

WYSIWYG (What-You-See-Is-What-You-Get) エディター、ワード プロセッサー、DTP パッケージを使ったことがある人なら、おそらく 2 つのフラストレーションを感じたことがあるはずです。

WYSIWYG is restrictive Suppose you cant get to see what you want? What you see is what you get には、さらに、見ることができないものは、得ることもできないという暗黙の含意があります。

LaTeX(ラテックスと発音)は、WYSIWYGアプローチに従わないタイプセットシステムです。 その代わりに、プログラミング言語からヒントを得ています。 プログラミング言語の長所と短所をすべて受け継いでいる。 LaTeXの文書は、画面上で文書を作成する(WYSIWYGアプローチ)のではなく、LaTeXシステムに文書を作成する方法を指示するプログラムです。 1665>

これは WYSIWYG アプローチに慣れている人には少し奇妙に聞こえるかもしれませんが、高レベルのプログラミング言語のパワーと柔軟性を楽しむ(または評価する)人は誰でも、LaTeX は単に文書を設計するのにより良い方法だとすぐに気がつくでしょう。

この記事では、無料の LaTeX システムをダウンロードし、通常の文書をいくつか書ける程度に、LaTeX 言語について少し説明します。 LaTeX のすべての機能を説明する時間はありませんが (これは本一冊分かかります)、LaTeX を使って文書を書くことがプログラムを書くのと同様の活動であるということを強く感じていただければと思います。 最初の行は、定義済みのLaTeXコマンドです。 すべてのコマンドはバックスラッシュ文字で始まります。 最初の行のコマンドは、タイプセットされるドキュメントのグローバルなプロパティを確立します。 文書スタイルarticleは、短い記事に使用されるスタイルです。 他のスタイルには、book、report、thesisなどがある。 各文書スタイルでは、文書のレイアウトを記述するグローバルパラメータを変更します。 例えば、book環境では、章タイトルと著者を示すランニングヘッダーが代替ページで生成されます。

すべての優れたプログラミング言語と同様に、もちろん、これらすべては完全に設定可能です。 しかし、ほとんどのプログラミング言語と同様に、より柔軟性を求めるほど、基礎となるプログラミング言語について知る必要があることに気づくでしょう。 幸いなことに、すべてのLaTeX環境のデフォルト設定は非常に優れた結果をもたらしますので、基礎となる言語をあまり知らなくても、長い道のりを歩むことが可能なのです。

ドキュメントのテキスト自体はコマンドの中に含まれています \begin{document} …. \⑭end{document}、⑯begin{}、⑯end{}は環境を開いたり閉じたりするコマンドです。 すべての文書(および文書の断片)は環境の中でタイプセットされます。 後述するように、環境を入れ子にすることもできます。

空白文字はLaTeXでは重要ではなく、1個の空白は100個と同じです。 改行はどこにでも入れることができますが、ある段落が終わり、別の段落が始まる点を示すには、2つ以上の改行が使用されます。 最終的なドキュメントをプリントアウトする際、LaTeX はテキストを左寄せと右寄せにします(純粋な両端揃えが魅力のない出力になる場合はハイフンを挿入します)。

大きなドキュメントは通常いくつかのセクションからなり、サブセクションを含むこともあります。 LaTeX では、新しいセクションは \section コマンドで、新しいサブセクションは \subsection コマンドで導入されます。 図2のLaTeXソースコードは2つのセクションからなるドキュメントを記述しており、タイトルはintroductionとrationaleとします。 ソースコードでは、セクションにセクション番号を付ける必要がないことに注意してください。 LaTeXは文書をコンパイルする際にこの処理を行います。 したがって、introductionはセクション番号1、rationaleはセクション番号2になります。 2 つのセクションの出現順序を入れ替えた場合(ソース コードをカット アンド ペーストして)、rationale はセクション 1 になり、introduction は自動的にセクション 2 になります。

ここで重要な問題が発生しました。 あるセクションから別のセクションへの相互参照はどのように行うのでしょうか。 例えば、私がセクションrationaleの中でセクションintroductionを参照したいとします。 これを実現する方法は、LaTeX の方法から得られる最初の利点を示しています。

シンボリック参照

LaTeX ソース ファイルはプログラムなので、ドキュメントの一部を参照するためにシンボリック名を使用することができます。 これは相互参照が論理的な実体であり、ドキュメントのある名前のついた部分を参照するため、相互参照を楽しくします。 もし、この名前の付いたドキュメントの部分が移動されるべきならば、私たちがしなければならないのは、再コンパイルだけです。

シンボリックな参照を導入するには \label{} コマンドを使用し、参照するには \ref{} コマンドを使用します。 図3はその説明です。 \label{intro}はlabelというシンボリック名を導入しますが、その値はthe \label commandが現れるコンテキストに依存します。 この場合、 \label コマンドはドキュメントの最初のセクションで使用されているので、intro に割り当てられる値は 1 になります。 \ref{}コマンドは、単にラベルの値を生成します。 ここで、intro を新しい位置、たとえば、rationale セクションの後に移動すると、intro の値は 2 に変わり、rationale のクロスリファレンスはセクション introduction の新しい位置を指すようになります。

この書き方は、物理レベルではなく、論理レベルでドキュメントを考えるようにします。 たとえば、section \ref{intro} で先に見たように書くのは愚かなことで、ラベル intro を参照の後のポイントに移動させるかもしれないからです。 このように、文書を特定の順序で記述されたテキストの一枚岩と考えるのではなく、より抽象度の高い、自由に移動できるセクションの集合体として考えるのです。 あるドキュメントから別のドキュメントでセクションを再利用することもでき、シンボリック名がユニークであれば、すべてのクロスリファレンスが正しく機能することがわかるでしょう。 例えば、箇条書きを使ってポイントの列を作りたいとします。 これは itemize 環境で行うことができ、図 4 のソース コードは、物質の 3 つの主要な状態を 1 行に 1 つずつリストし、それぞれの前に箇条書きのマークを付けたドキュメントを作成します。 多くの点で、LaTeXの文書設計の方法はHTMLの方法に似ています。 例えば、itemize 環境はむしろ HTML のソートされていないリスト環境に似ています。

時には、アイテムをソートされた番号付きリストに入れたいことがあります。 これは enumerate 環境で実現される。 図5は、地質学的時間の4つの時代とその中の期間を説明する、列挙された項目の入れ子シーケンスを示しています。 LaTeXでは、入れ子のレベルごとに異なる番号体系を使用しています(レベル1はアラビア数字、レベル2はアルファベット文字、レベル3はローマ数字)。

テキストの一部を強調するには、em(強調)環境で囲みますので、単に \begin{em} help! \と書くだけで、help という単語 (とそれに続く感嘆符) が強調されます。

手続き

従来のプログラミング言語では、手続きを定義する機能はプログラマにかなりの柔軟性を与えます。 LaTeX でも、テキストをレイアウトするためのプロシージャを定義することができます。 プロシージャの最も単純な形式はパラメータのないものです。 これはソースコードのある部分に名前を付けて、それを呼び出すことができます。 例えば、私がある果物を参照する文書を書いていて、それがリンゴなのかオレンジなのかナシなのかまだ決めていなかったとします。 そこで、fruitというプロシージャを導入し、そのボディに任意の果物の名前を入れることができます。 最終的にどの果物を参照したいかを決めたら、プロシージャのボディを変更するだけです。プロシージャが呼び出されるすべてのポイントは、自動的にボディの変更を考慮します。 LaTeXは本文中でこれらの呼び出しに出会うとこれを展開するため、コマンドはしばしばマクロと呼ばれます。 図6は,単純なパラメータレスマクロの使用法を示しています. この図の LaTeX ソースはコンパイルされると、The first apple to appear be the first apple I shall eat.

完全に公平に見て、これはおそらく WYSIWYG ワープロで検索と置換を実行するだけで、より簡単に達成できました。 (もちろん、この文が最初に出てきた \fruit is the apple of my eye であれば、うまくいかなかったでしょう!) しかし、これはLaTeXマクロで何ができるかを示す簡単な例に過ぎません。 しかし,これはLaTeXマクロで何ができるかの簡単な例に過ぎません.マクロはパラメータを与えることで本領を発揮します.

Parameters

私が配列処理に関するドキュメントを書いているとします。 配列の最大の要素を見つけるためのアルゴリズムを説明したいと思うかもしれません。 コマンドを使用することで、配列の特定の構文を使用せずに済みますし、少なくとも構文の違いを 1 つのコマンドで捉えることができるので、私のドキュメントを異なるプログラミング言語に適合させることがはるかに容易になります。

図7はこれを示している。 コマンドの定義では、LaTeX コンパイラに、コマンドは 2 つのパラメータを取り、1 つ目は #1、2 つ目は #2 と呼ばれることを伝えています。 コマンドの呼び出しでは、パラメータは中括弧の中で 1 つずつ提供されます。 だから、「S}{2}」というコマンドは、「S(2)」というテキストを生成する。 これは、Basicの “viewup “コマンドのバージョンです。 これを図8のバージョンに置き換えると、同じ文書が得られますが、配列の参照が角括弧で囲まれています。 これはC言語版の文書です。 プログラミング言語の手続きと同様に、ある手続きを別の手続きの本体から呼び出したり、手続き呼び出しの結果を別の手続きの実際のパラメーターとして使用したりすることが可能である。 そのため、例えば、 \lookup{A}{lookup{B}{1}} と書くことができ、これは \lookup コマンドの Basic バージョンか C バージョンかによって、テキスト A(B(1)) または A] を生成します。

変数

LaTeX には独自の変数があって、これに対して簡単な算術を実行できます (より進んだ算術の形式もできますが、タイプセットには通常加算だけが必要なのです)。 プログラマにはおなじみのカウンタ変数とフラグ変数です。

ドキュメントに一連の番号付きポイントを含めたいとします。 各ポイントに番号を付けるためにカウンタ変数を使用し、番号付けを制御するためにいくつかの簡単なコマンドを記述することができる。 図9はこれを示している。 カウンターは \newcounter というコマンドで宣言されます。 カウンターはコマンド ⑭setcounter で指定した値に設定します。 現在のポイント番号の出力とカウンターのステップ(値に1加算)には、コマンド ⑭ポイントを使用します。 コマンド⑭は、あるカウンタ<名>に対して、その変数の値を印刷します。 このコマンドは、ユーザーが導入した変数だけでなく、どんな変数にも使えるので、例えば、sectionという変数の現在値を出力するのは、”section “というコマンドです。 図9では、3つの点を印刷するために \point コマンドを使用しています。 このアプローチの素晴らしい特徴は、ポイントが発生する順序を変えることができ、それに応じて番号が変わることです。

さて、変数をフラグとして使用して、ドキュメントで生成されるテキストを選択する方法を見てみましょう。 これから見るように、フラグとマクロの組み合わせにより、フラグに適切な値を選択するだけでインスタンス化できる、非常に一般的なドキュメントを書くことができます。 例えば、配列に関するドキュメントを作成する際に、”array “というコマンドをBasicとCの2種類の形式で使用する場合を考えてみましょう。 そうすれば,コンパイルする前にフラグに正しい値を与えるだけでよい. 図10はこれを示している.

最初に行うべきことは、documentstyle 宣言に ifthen オプションを含めることです。 これにより、後でコマンドの “ifthenelse “を使用することができます。 次にカウンタ変数 language を宣言し、言語が Basic の場合は 1、C の場合は 0 に設定します。% 記号は LaTeX がコメント用に使用するもので、% 記号の後(行末の前)に現れるテキストは LaTeX コンパイラによって無視されます。 次に、カウンターを 1 に設定します(コマンド \setcounter{language}{1} )。 この特殊化には、改良された “the \lookup” コマンドを使用します。 このコマンドは、言語変数の値をテストするために内蔵されているコマンドです。 \ifthenelse{<test>}{<then_branch>}{<else_branch>} という形式になっています。 これは、通常のプログラミング言語におけるif文と同じような動作をします。 もし <test> が true と評価されれば、<then_branch> にあるテキストが生成され、もし false なら <else_branch> にあるテキストが生成される。

このフラグを使って、それぞれが特定の種類のステートメントのテキストを生成し、言語はフラグカウンタ変数の値によって異なる、多数のコマンドを書くことができるだろう。 このようにして、プログラミングに関する一般的なドキュメントを書き、フラグを適切に設定するだけで、必要な専門的なドキュメントを作成することができるのです。

図 10 は、これをどのように行うかを示しています。 配列検索 (前述のように \lookup マクロを使用)、配列更新、およびより詳細には、for ループの適切な構文を生成するコマンドのための Basic または C 構文を生成するコマンドを定義しています。 C の for ループと Basic の for ループの違いは主に構文的なもので、LaTeX の柔軟性を利用して、これらの構文の詳細から逃れることができます。 コマンドの \forloop は、ループの 4 つの要素を Basic スタイルでレイアウトするか C スタイルでレイアウトするかを決めるのに、フラグカウンタ言語を使用しました。 これにより、ターゲット文書がどちらの言語を参照するかを決めることなく、配列の初期化やループに関するテキストを書くことができます。

C バージョンの for ループ構文では、ループ本体の文を囲む中括弧は \{ … } と書かれていることに注意してください。 \と書かれていることに注意してください。 }. これは、中括弧の記号がすでにLaTeXにとって意味を持つため、中括弧を出力させるためにバックスラッシュを前につけているためです。

図10では、カウンター言語を1にしているので、出力はfor Basicとなります。 図10のソースコードから,LaTeXは図11のような出力を生成します. もし、C言語の配列について同じことを書いた文書を作りたい場合は、 \setcounter{language}{1} の行を、 \setcounter{language}{0} に変更するだけでよいのです。 1665>

数学

LaTeX は、複雑な数学のタイプセットを可能にする方法としてしばしば(そして正しく)賞賛されます。

数学のテキストは、インラインでレイアウトすることができ、その場合は入力された文中に表示され、ディスプレイ モードでは、それ自身の行の中央に表示され、そのように表示されます。 標準的な数学記号とテキストの形式はすべて、コマンドを使用するために用意されています。 LaTeXは長い間、世界中の多くの数学者によって使用され、開発され、改良されてきたので、誰かが対応していない数学の出力形式が存在することは極めて稀です。 技術書の準備によく使われ、著者が出版社にカメラレディのコピーを提供できるため、本棚をさっと探せば、おそらくいくつかのコンピュータや数学の教科書に LaTeX への謝辞が見つかるでしょう。 すべての LaTeX 開発は完全に後方互換性があるので、あなたの文書がいつの間にか時代遅れになることを心配する必要はありません。

Reuse

LaTeX を使って生産的になるには 2 日から 1 週間かかると私は推測しています。 多くの読者は、WYSIWYG エディタのリードイン時間と比較すると、これを受け入れがたいと考えるかもしれません。 確かに、手紙やメモのような文書を作成するだけであれば、LaTeXを検討する価値はないでしょう。 しかし、大量のテキストを作成することに関心があり、最終的に数ヶ月の作業を節約できるシステムに投資する用意があるならば、LaTeX は答えとなるかもしれません。

LaTeX ユーザーが経験する最も無形の、しかし最も魅力的なメリットは、優れたプログラミング言語のように、LaTeX が再利用をサポートするという方法に由来しています。 すぐにあなた自身の個人的なマクロのセットを構築し、あなたの好みに合わせて文書を調整することができるようになることでしょう。 ある文書の一部を別の文書で再利用することは、簡単かつシームレスに実現できます。 このシームレスさは、LaTeXのアプローチの2つの側面に由来しています。 ドキュメントのパーツに記号的な名前を付けることで、ドキュメントが編集されるたびに相互参照が自動的に更新されます。 環境という概念は、同じ原文が異なる文脈に置かれた場合、異なる印象を与える可能性があることを意味します。 もちろん、これはWYSIWYGの原則と正反対ですが、LaTeXの本質的な長所と言えます。 多くのコンピュータ雑誌、会議、出版社が独自の LaTeX スタイル ファイルを提供しており、LaTeX ソース ファイルに含まれると、出版に必要な形式で自動的にドキュメントがレイアウトされます。 LaTeX はほとんどの UNIX プラットフォーム、そしてほとんどの Linux ディストリビューションに標準装備されていますので、 もしこれらのものを使っているならば man latex とタイプしてみてください。 多くの有用な LaTeX ツール、マクロ、関連ドキュメントを含む FTP サイトが ftp.tex.ac.uk.

LaTeX 文書作成の主題について、不可欠な本が2冊あります。 どちらも非常に読みやすく、有益な本です。 Leslie Lamport 著 LaTeX A Document Preparation System (ISBN 0-201-15790-X) は基本的なシステムを説明しており、入門書としては非常に良い本です。 ほとんどの通常の文書をすぐに書くのに十分な情報が含まれています。 LaTeX Companion (Mike Goossens, Frank Mittelbach and Alexander Samarin) (ISBN 0-201-54199-8) はより詳しく,LaTeX2eプロジェクトで追加されたすべての新機能をカバーしています. 本書は、LaTeXを使って多くの文書を書き、自分好みに言語をカスタマイズしたい場合に有効です。 例えば、テキストをハート型にレイアウトする(2月14日直前に書かれた特定の文書に役立つかもしれません)など、あらゆる種類のエキゾチックな効果を実現する方法が説明されています。 これらの本は両方とも Addison-Wesley から出版されています。

Logical is better

LaTeX文書作成システムは、長年にわたって進化し改善されてきました。 それは非常に堅牢で、テキストと数学を含む出版可能な標準にドキュメントを書くための機能を提供します。 LaTeX 文書はプログラミング言語を用いて記述され、LaTeX ユーザーは従来のプログラミング言語のパワーと柔軟性をすべて享受することができます。 このような書き方により、ユーザーは文書を物理的な外観ではなく、論理的な構成のレベルで見ることを余儀なくされます。 これは当初は少し不満ですが、最終的には再利用のサポートや、いくつかの物理的なインスタンスを持つ可能性のある一般的な文書の作成など、多くの利点があります

Mark Harman はノースロンドン大学(http://www.unl.ac.uk/~mark/welcome.html)の情報学およびマルチメディア技術学部で研究部長と部長代理を務めています。 連絡先は電子メール [email protected] または郵送で Mark Harman, Project Project, School of Informatics and Multimedia Technology, University of North London, Holloway Road, London N7 8DB.


Figure 1 Simple LaTeX document.の図。

documentstyle{article}

begin{document}

hello world

end{document}


Figure 2 Sections

documentstyle{article}

begin{document}

section{Introduction}

この文書はかなり短く、これはそのイントロダクションです。

section{Rationale}

この文書がこれほど短いのは、それが単純で例であるためである。

And{document}


Figure 3 Symbolic references

Adocumentstyle{article}

begin{document}

section{Introduction}

label{intro}

これはかなり短い文書で、これはその紹介である。

Rationale}

このドキュメントの簡単な紹介は、section \ref{intro}.

END{document}


Figure 4 Itemize環境です。

⑯begin{itemize}

⑯item Solid

⑯item Liquid

⑰item Gas

END {itemize}


Figure 5 Enumerate 環境についてです。

୧begin{enumerate}

୧Cenozoic

୧begin{enumerate}

୧Quaternary

୧Tertiary

୧end{enumerate}

୧TEM Mesozoic

begin{enumerate}

item Cretaceous

item Jurassic

item Triassic

end{enumerate}

item Paleoica

Carboniferous

Cevonian

Cilurian

Ordovician

Thomas

Benumerate Cambrian

\end{enumerate}

\item Precambrian

\end{enumerate}


図6 パラメターレスコマンド。

{article}

{newcommand{fruit} { apple }

begin{document}

The first \fruit to appear be the first \fruit I shall eat.

end{document}


Figure 7 Parameters.Figure7.1参照。 Basicバージョン。

documentstyle{article}

newcommand{lookup} { #1(#2) }

୧begin{document}

配列Aの最大の要素を求めるには、最初の要素である \lookup{A}{0} を変数bに格納します。 ループの各ポイントで、要素i、 \lookup{A}{i} とbの値を比較し、 \lookup{A}{i} がbより大きければ、bに \lookup{A}{i} を代入します。

end{document}


図8 パラメータ。 Cバージョン。

documentstyle{article}

newcommand{lookup}1665 {次に、変数iで制御して、1から配列の終わりまでループさせます。 ループの各ポイントで、要素i、 \lookup{A}{i} と b の値を比較し、 \lookup{A}{i} が b より大きい場合、b に \lookup{A}{i} を代入します。

end{document}


Figure 9 Counter variables.

ENEWCOUNT{pointnumber}

setcounter{pointnumber}{1}

NTewcommand{point} {1665> Physpaces {1665 {ポイント ╱ポイント番号 ╱ステップカウンタ ╱ポイント数 }

Photopoint

Some text associated with one of points

Some text associated with another point

Photopoint

Yet another point


図10 フラグ変数の例。

\documentstyle{article}

\newcounter{language} Basicは1、Cは0に設定

setcounter{language}{1}

\newcommand{\lookup}

{

ifthenelse{value{language} = 1}. {#1(#2)} {#1}

}

Newcommand{Update}

{1665>

Thenelse{value} = 1}. {レット #1(#2) = #3}. {#1 = #3}

}

% forloopコマンドは4つのパラメータをとります

% 1. ループの下限値 – 整数または積分式

% 2. ループの上限値(整数または積分値)

% 3. ループ制御変数 – 整数型変数.

% 4. 4. ループ本体 – 連続した文

% The flag counter language, is used to determine the language in which

% the syntax of the loop is written.

\newcommand{entaforloop}

{

\ifthenelse{entavalue{language} = 1}.

{

FOR #3 = #1 TO #2

NEXT #3

}

{

for(#3=#1;#3 !

)= #2;#3++)

Think{

Think}

begin{document}

配列Aの要素番号3番に値10を格納するには、 \update{A}{3}{10} と書きます。}

配列Aの0から10までの要素を初期値0で初期化するには、0から始めて10までforループを使用します。 これは次のように書きます。

■forloop{0}{10}{i}{}}update{A}{i}{0}

end{document}


図11 図10のLaTeXソースをまとめた結果です。

配列Aの要素番号3に値10を格納するために、LET A(3) = 10と記述する。

配列Aの0から10までの要素を初期値0で初期化するには、0から始まって10まで続くforループを使えばよい。 これは次のように書きます。

FOR i = 0 TO 10

LET A(i) = 0

NEXT i

(P)1997, Centaur Communications Ltd.. EXE MagazineはCentaur Communications Ltd.の出版物です。 この著作物の全部または一部を、ケンタウルス・コミュニケーションズ社および著作権者が異なる場合はその明示的な許可なく、電子的な方法を含むいかなる方法でも出版することはできません。

EXE Magazine, St Giles House, 50 Poland Street, London W1V 4AX, email [email protected]

コメントを残す

メールアドレスが公開されることはありません。