TeX」カテゴリーアーカイブ

TeX, LaTeX 関連の記事

LaTeX の数式をターミナルで手軽に MathML に変換する

テキストエディタで HTML 文書を直書きしていて、 MathML で数式を書きたいけど MathML 直書きは嫌だ!という時。Pandoc を使えば、ターミナルで手軽に LaTeX 形式の数式を MathML に変換できる。

例:

$ pandoc -f latex -t html5 --mathml
\(\frac{1}{e^z-1}\)
^D
<p><math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mfrac><mn>1</mn><mrow><msup><mi>e</mi><mi>z</mi></msup><mo>−</mo><mn>1</mn></mrow></mfrac><annotation encoding="application/x-tex">\frac{1}{e^z-1}</annotation></semantics></math></p>

太字の部分が自分で入力する部分である。(^D は Control-D の意)

\mathfrak と打つのがだるい

数学の一部の分野では、フラクトゥールが多用される。数式中でフラクトゥールな文字をLaTeXで書く際は \mathfrak{a} とか書くわけだが、たくさん出てくると入力するのがだるい。

短い名前をつける

幸い、LaTeXにはマクロ機能があるので、 \mathfrak のコマンド名が長いと思ったら、短い名前を与えてやれば良い。

\newcommand\mf{\mathfrak}
\mf{a} % → \mathfrak{a} になる
\mf a % → 上に同じ。コマンドの引数が1文字の場合は { } を省略できる

個々の文字にコマンドを割り当てるという手もある。

\newcommand\a{\mathfrak{a}}
\a % → \mathfrak{a} になる…はず

が、しかし、 \a という名前のコマンドは LaTeX によってすでに定義されているようで、 \newcommand でエラーが出る。\renewcommand を使えば定義を上書きできるが、副作用が怖い。

別の名前を試してみよう。

\newcommand\aa{\mathfrak{aa}}
\aa % → \mathfrak{a} になる…はず

が、しかし、\aa という名前のコマンドも LaTeX によってすでに定義されているのであった。

このように、「短い名前をつける」という戦略は「名前の衝突」によって阻まれる可能性がある。\renewcommand や、TeX primitive の \def によって上書きすることはできるが、既存のコマンドの不具合(副作用)を引き起こす可能性は否定できない。

ただ、上書きするスコープを限定してやれば、副作用を引き起こす可能性は小さくできるかもしれない。

{ % スコープを作る
\renewcommand\aa{\mathfrak{a}}
$\aa$ % → \mathfrak{a} になる
} % スコープを閉じる

\aa % → 元の意味(å)になる

\begin{center} % \begin{} 〜 \end{} は一つのスコープになる
\renewcommand\aa{\mathfrak{a}}
$\aa$ % → \mathfrak{a} になる
\end{center}

\aa % → 元の意味(å)になる

毎回 \renewcommand\aa{\mathfrak{a}} と打つのが面倒だったら、これもマクロにすると良いだろう。

\newcommand\UseMathFrak{%
  \renewcommand\aa{\mathfrak{a}}%
}

{ % スコープを作る
\UseMathFrak
$\aa$ % → \mathfrak{a} になる
} % スコープを閉じる

\aa % → 元の意味(å)になる

\begin{center} % \begin{} 〜 \end{} は一つのスコープになる
\UseMathFrak
$\aa$ % → \mathfrak{a} になる
\end{center}

\aa % → 元の意味(å)になる

短い名前をつける(亜種)

普通のコマンド名はバックスラッシュ \ から始まるが、コマンド名として使えるものはこれだけではない。TeX 標準では、半角チルダ ~ を単独で(バックスラッシュなしに)コマンド名として使うことができる。

知っての通り、半角チルダ ~ は標準では「改行しない空白」という意味を持つが、そこは\renewcommand で上書きしてやる。

\renewcommand~{\mathfrak}
~a % → \mathfrak a と等価

既存のコマンドを上書きすると副作用が怖い、とか、元のコマンドが使えなくなる、という場合は、スコープの中で \renewcommand することによって影響範囲を小さくできる。

Unicode の文字を使う

Unicode には、様々な字体の「数式用アルファベット」が用意されている。その中には、フラクトゥールもある。これらを LaTeX ソース中に直接記述すれば、\mathfrak といちいち書かなくても良くなるのではないか。

スクリーンショット 0028-05-26 19.24.28

unicode-math パッケージを使うと、 Unicode の数式用アルファベットで書いたものを LaTeX\mathfrak 等で書いたものと等価にしてくれる。

ただし、 unicode-math パッケージを使うには LuaTeXXeTeX が必要である(e-upTeX や pdfTeXでは使えない)。

注意点として、 unicode-math を使うと Unicode の数式用アルファベットのカテゴリーコードが変わるようだ。unicode-math を使わなければカテゴリーコード11 (letter) だが、unicode-math を使うとカテゴリーコード12 (other) になる。どう影響するかというと、 例えば

𝔞\to𝔟     % ← \to の後に空白がない

と書いた時に、 unicode-math を使わないと「文字 “𝔞”」「コマンド名 “\to𝔟”」として解釈されるのが、 unicode-math を使うと「文字 “𝔞”」「コマンド名 “\to”」「文字 “𝔟”」として解釈されるようになる。普通は前者の挙動の方が望まれるとは思うが。

unicode-math を使わない(使えない)場合、 Unicode の数式用アルファベットのカテゴリーコードを13 (active) にしてマクロを定義するという手がある。

\catcode`𝔞=\active % “𝔞” という文字を単独でコマンド名として使えるようにする
\newcommand{𝔞}{\mathfrak{a}}
𝔞 % → \mathfrak{a} に展開される

いずれにせよ、TeX エンジンの側で Unicode に対応している必要がある。

Unicode の数式用アルファベットを使う方法ならば、「短い名前をつける」方法にあった「コマンド名がかぶる」という問題は存在しない。ただし、デメリットとして、 Unicode の数式用アルファベットを入力するのは面倒くさいということが挙げられる。

結論

エディター側で入力支援的なものが欲しい。

LaTeX の \verb についてのメモ

導入

LaTeXをやったことがある人なら \verb コマンドはきっと知っているだろう。

例: \verb|hoge|hoge

例: \verb+foo bar+foo bar

亜種として、\verb の直後にスター * がついた版は、空白を可視化する(空白が ⎵ みたいな記号になる)。

例:\verb*+foo bar+foo⎵bar

この \verb というコマンドは、「TeXの特殊文字を無力化する」「任意の文字を終端として使える」という点で、非常に風変わりである。\verb コマンドを知ることは、TeXの字句解析のルール(カテゴリーコードとか)に対する理解を深めることに直結すると言っても過言でないだろう(たぶん)。というわけで、\verb について重箱の隅をつついた結果をここに書いておく。

なお、TeXにおける「カテゴリーコード」とかそういうアレはここでは解説しない(対象読者が謎)。

続きを読む

dvisvgmとSTIXフォント

以前、dvisvgmについてちょろっと書いた。その時は、dvisvgmでSVGファイルを生成する時に --no-fonts オプション(文字のアウトライン化をする)をつけないとフォントが正常に指定されないという結論だったわけだが、それではブラウザで表示した時に文字が選択できない。

そこで、dvisvgmで --no-fonts オプションを使わずに生成したSVGファイルで、文字が正常に表示されるような方法を考えてみよう。

続きを読む

LaTeXでPDF出力する際のTips その2

LaTeXでPDF出力する際のTips では、

  • PDFのメタデータの文字化けの解消方法
  • PDFのタイトルや作成者を \title, \author から自動的に設定する方法

を扱った。

今度は、PDFの目次(ブックマーク、しおりと呼ぶこともあるようだが、この記事では「目次」で通す)についてのTipsを扱う。

続きを読む

TeXでファイルの更新日時を取得する

TeXでは \today で現在の日付を取得できる。\maketitle\date を省略すると現在の日付になる。

しかし、TeX文書の「内容」に関わる日付と言ったら、ファイルの更新日時ではないだろうか。タイトルのところにファイルの更新日時を(自動で)出す方法はあるか。

ググってみたら割と簡単に答えが出てきた。

pdfTeXだと \pdffilemoddate というプリミティブがあるらしい。例えば \pdffilemoddate{\jobname} と書くとコンパイル中のファイルの更新日時が D:20150829212230+09'00' というようなフォーマットで取得できるようだ。

LuaTeXだと \pdffilemoddate はないが、Luaを使えば同じようなことはできるだろう。まあ自分でLuaコードを書いて実装するのは面倒なので、既製品を使おう。

filemodというパッケージはpdfTeXとLuaTeXで使えて、ファイルの更新日時を取得するだけじゃなくて、\today と同じような読みやすいフォーマットにしてくれるようだ。例えば、ファイルのプリアンブルに

\usepackage{filemod}
\date{\Filemodtoday{\jobname}}

と書けばタイトルの日付がファイルの更新日時になる。

複数のファイルの中で最も新しい更新日時を使いたいときは、試してないけど \filemodNewest を使えば良さそう。

既に書いたように、filemodパッケージはpdfTeXかLuaTeXが必要で、pTeXXeTeXでは動かない。

【2016年12月12日 追記】ε-pTeX では \pdffilemoddate を含むいくつかの pdfTeX primitive が実装されているため、 filemod パッケージを使うことができる。参考:ε-pTeX について

TeX界隈のロゴをHTML+CSSで

TeXのロゴは、真ん中の“E”の文字が下に下がっていて、2次元的になっている。プレーンテキストではこういうのが表現できないので“TeX”のように小文字で代用するわけだが、HTML文書でそんなことをするのは甘えである。

そこで、HTML+CSSでTeXのロゴを再現してみよう。(TeXのロゴよりもLaTeXの方が見た目を調整する要素が多いので、ここでは、LaTeXのロゴで行う)

案1

愚直に、AとEの位置をCSSのvertical-alignプロパティーでずらした。

表示例: LATEX

コード例(見やすいように改行とか空白とか使ってインデントしている)
[code lang=”html”]
<span style="font-family: serif;">
L
<span style="vertical-align: super;">
A
</span>
T
<span style="vertical-align: sub;">
E
</span>
X
</span>
[/code]

案2

なんか本物はAの文字が小さい気がする。font-size: smallerを指定しよう。

表示例:LATEX

[code lang=”html”]
<span style="font-family: serif;">
L
<span style="vertical-align: top; font-size: smaller;">
A
</span>
T
<span style="vertical-align: sub;">
E
</span>
X
</span>
[/code]

案3

本物は文字の間隔が詰まっている気がする。letter-spacingを指定しよう。letter-spacingの値は、検討の余地があるだろう。

表示例:LATEX

[code lang=”html”]
<span style="font-family: serif; letter-spacing: -0.1em;">
L
<span style="vertical-align: top; font-size: smaller;">
A
</span>
T
<span style="vertical-align: sub;">
E
</span>
X
</span>
[/code]

案4

最近のSafari、そして直近のFirefoxにはリーディングモードだかリーダーモードが搭載されている。このモードではサイト側で指定したCSSがだいたい無効になる。そうすると、案1〜案3で書いたLaTeXはすべて大文字の“LATEX”になってしまう。これは好ましくない。CSS無効の場合は“LaTeX”になってほしい。

そこで、HTMLとしてはAとEを小文字で書いておき、CSSのtext-transform: uppercaseで見た目を大文字にする。

表示例:LaTeX

[code lang=”html”]
<span style="font-family: serif; letter-spacing: -0.1em;">
L
<span style="vertical-align: top; font-size: smaller; text-transform: uppercase;">
a
</span>
T
<span style="vertical-align: sub; text-transform: uppercase;">
e
</span>
X
</span>
[/code]

ちなみに、この方式で書いた“LaTeX”ロゴをブラウザからコピペした場合、Safariだとすべて大文字で、FirefoxだとAとEが小文字でコピーされた。

おまけ:XeTeX

XeTeXとかいうやつは2文字目のEが反転している。最新のCSS技術を使えば、特定の文字を反転させるのもお手の物である。

表示例:XeTeX

[code lang=”html”]
<span style="font-family: serif; letter-spacing: -0.05em;">
X
<span style="vertical-align: sub; text-transform: uppercase; transform: scale(-1,1); -webkit-transform: scale(-1,1); display: inline-block;">
e
</span>
T
<span style="vertical-align: sub; text-transform: uppercase;">
e
</span>
X
</span>
[/code]

おまけ:WordPressで

このブログはWordPressで動かしているわけだが、LaTeXに言及するたびに長ったらしいHTMLを書き込むのはだるい。また、「以前はこういう書き方してたけどやっぱりこの書き方の方がいいな」となったときにいちいちLaTeXロゴを使っている記事を探して置換するのはだるい。

そこで、WordPressのテーマをいじって、本文中に [LaTeX-logo] と書けばそれがLaTeXロゴを表すHTMLに化けてくれるようにしよう。(こういう風に “[” “]” で囲むやつを、WordPress用語でshortcodeと言うらしい)

テーマのfunctions.phpに以下を書き込む。何をやっているかは、雰囲気でわかるだろう。

[code lang=”php”]
function tex_logo_shortcode() {
return "<span style=\"font-family: serif; letter-spacing: -0.1em;\">T<span style=\"vertical-align: sub; text-transform: uppercase;\">e</span>X</span>";
}
add_shortcode( ‘TeX-logo’, ‘tex_logo_shortcode’ );

function latex_logo_shortcode() {
return "<span style=\"font-family: serif; letter-spacing: -0.1em;\">L<span style=\"vertical-align: top; font-size: smaller; text-transform: uppercase;\">a</span>T<span style=\"vertical-align: sub; text-transform: uppercase;\">e</span>X</span>";
}
add_shortcode( ‘LaTeX-logo’, ‘latex_logo_shortcode’ );

function XeTeX_logo_shortcode() {
return "<span style=\"font-family:serif;letter-spacing:-0.05em;\">X<span style=\"vertical-align:sub;text-transform: uppercase;transform:scale(-1,1);-webkit-transform:scale(-1,1);display:inline-block;\">e</span>T<span style=\"vertical-align:sub;text-transform: uppercase;\">e</span>X</span>";
}
add_shortcode( ‘XeTeX-logo’, ‘XeTeX_logo_shortcode’ );

function xypic_logo_shortcode() {
return "<span style=\"font-family: serif;\"><span style=\"letter-spacing: -0.2em;\">X<span style=\"vertical-align: sub; text-transform: uppercase;\">y</span></span>-pic</span>";
}
add_shortcode( ‘xypic-logo’, ‘xypic_logo_shortcode’ );
[/code]

真面目にやるなら

この記事ではなんとな〜くノリでロゴの見た目を調整したが、真面目にやるならTeXでの \TeX コマンドの定義を見て文字の大きさとか位置を調整するべきだろう。

ググったらそういうことをやっている人がいたのでリンクを貼っておく。

Xy-picとdvisvgm

LaTeXで図式を書くのに、Xy-picというパッケージがある。このパッケージで書いた図式を、dvisvgmコマンドでSVG形式に変換しようという話。

大まかな流れ:

  1. Xy-picで作った図式を含むLaTeXソースをコンパイルしてDVIファイルを作る。
  2. DVIファイルをdvisvgmコマンドでSVG形式に変換する。

今回ハマったポイント(結論):

  • Xy-picにはPostScriptやPDFなどのバックエンド(ドライバー)を指定しよう。
  • dvisvgmに--no-fontsを指定することでSVGファイルの文字を正しく表示できるようになる。

以下、結論に至るまでの過程: 続きを読む