TikZの図式を検証するためのツールです。 (.NET 7.0を使用したWindowsアプリケーション)
- CheckTikZDiagram.exe を実行します。
- 「ファイル選択」ボタンをクリックして.texファイルを選択します。
- 下記仕様に従って,誤りのある部分を検出します。
- 読み込むときのルールは「設定1」「設定2」タブで設定します。(設定した内容はconfig.xmlに保存します。)
選択した.texファイルを前から順に読んでいきます。 数式環境($で囲まれた部分のみが対象)があれば、その中身を「射の定義」として保持しておきます。 tikzpicture環境があれば、その中身を読み込み、それがあらかじめ保持している「射の定義」と「一致」するかを検証します。 どのような場合に「一致」するとみなすかは以下で説明します。
例えば次のような.texファイルがあるとします。(プリアンプルは省略)
\begin{document}
$f\colon a\rightarrow b$,$g\colon b\rightarrow c$,$k\colon a\rightarrow c$を圏$C$の射とする.
即ち図式で描くと次のような状況である.
\[\begin{tikzpicture}[auto]
\node (a) at (0, 0) {$a$}; \node (b) at (1, 1) {$b$}; \node (c) at (2, 0) {$c$};
\draw[->] (a) -- node {$\scriptstyle f$} (b);
\draw[->] (a) -- node[swap] {$\scriptstyle g$} (c);
\draw[->] (b) -- node {$\scriptstyle k$} (c);
\end{tikzpicture}\]
\end{document}
この.texファイルはgとkの位置を間違えています。 実際,これをコンパイルすると次のようなPDFが出来上がり、図式が(もしくは本文が)間違っていることが分かります。
この.texファイルをCheckTikZDiagram.exeで処理すると、次のように間違っていることを示すメッセージが表示されます。
- CheckTikZDiagram.exeは、tikzpicture環境の各矢印に対して処理を行います。
- どのような形式のTikZを射とみなすかは「設定2」タブで設定します。
- 処理の結果、エラーがあった場合はメッセージを出力します。(「エラーのあった行のみ表示する」のチェックを外すと全て表示します。)
- 一番左の「行」は、対象となる矢印が.texファイルの何行目にあるかを示しています。
- 「結果」の上段には、対象の矢印を解釈した結果が表示されています。
- 「結果」の下段の g: b → c (12行目) というのは、本文の12行目にこのように定義されているということを示しています。
- 本文のどのような形式の数式を射とみなすのかは、「設定2」タブで設定します。
合成できる射の場合、合成した射はその通り解釈されます。 例えば次のような.texファイルは正しいと判断されます。 (合成に何の記号(TeXコマンド)を使用するかは「設定1」タブで設定します。)
\begin{document}
$f\colon a\rightarrow b$,$g\colon b\rightarrow c$を圏$C$の射とする.
\[\begin{tikzpicture}[auto]
\node (a) at (0, 0) {$a$}; \node (b) at (1, 1) {$b$}; \node (c) at (2, 0) {$c$};
\draw[->] (a) -- node {$\scriptstyle f$} (b);
\draw[->] (b) -- node {$\scriptstyle g$} (c);
\draw[->] (a) -- node[swap] {$\scriptstyle g\circ f$} (c);
\end{tikzpicture}\]
\end{document}
本文に書かれた射の定義において、domainもしくはcodomainが圏とみなされたものについては「関手」として扱われます。 例えば次のような場合、Fは関手とみなされます。 (何を圏とみなすかは「設定1」タブで設定します。)
\begin{document}
$F\colon \Set \rightarrow \Ab$を関手,$f\colon a\rightarrow b$,$g\colon b\rightarrow c$を写像とする.
\[\begin{tikzpicture}[auto]
\node (a) at (0, 0) {$Fa$}; \node (b) at (1, 1) {$Fb$}; \node (c) at (2, 0) {$Fc$};
\draw[->] (a) -- node {$\scriptstyle Ff$} (b);
\draw[->] (b) -- node {$\scriptstyle Fg$} (c);
\draw[->] (a) -- node[swap] {$\scriptstyle F(g\circ f)$} (c);
\end{tikzpicture}\]
\end{document}
このとき図式中に現れる Ff は射 Fa → Fb とみなされます。 よって上記の.texファイルは正しいと判断されます。
Homや関手圏から元を取った場合、それも射として扱われます。
\begin{document}
$f\in\Hom_C(Fa, Gb)$とする.
\[\begin{tikzpicture}[auto]
\node (a) at (0, 0) {$Fa$}; \node (b) at (1, 0) {$Gb$};
\draw[->] (a) -- node {$\scriptstyle f$} (b);
\end{tikzpicture}\]
\end{document}
(いつか書く)
(いつか書く)
(いつか書く)
(いつか書く)
(いつか書く)
(いつか書く)
本文に書かれていない射がいきなり図式に出てくるような場合、コメントを使って射の定義を書くことができます。 やり方は、TeXのコメント内に CheckTikZDiagram と書くと、その行の後ろが射の定義として認識されます。
\begin{document}
$f\colon a\rightarrow b$,$g\colon a\rightarrow c$を$C$の射とする.
このとき次の点線の射が取れる.
%CheckTikZDiagram $h\colon b\rightarrow c$
\[\begin{tikzpicture}[auto]
\node (a) at (0, 1) {$b$}; \node (c) at (1, 1) {$c$};
\node (b) at (0, 0) {$a$};
\draw[->] (a) -- node[swap] {$\scriptstyle f$} (b);
\draw[->] (a) -- node {$\scriptstyle g$} (c);
\draw[->,densely dashed] (b) -- node[swap] {$\scriptstyle h$} (c);
\end{tikzpicture}\]
\end{document}
tikzpicture環境内で、行末にコメントでCheckTikZDiagramIgnoreと書くと、その行は無視されます。 例えば次の場合、本来はkがエラーとなりますが、このエラーは無視されます。
\begin{document}
$f\colon a\rightarrow b$,$g\colon b\rightarrow c$,$h\colon a\rightarrow c$を圏$C$の射とする.
\[\begin{tikzpicture}[auto]
\node (a) at (0, 0) {$a$}; \node (b) at (1, 1) {$b$}; \node (c) at (2, 0) {$c$};
\draw[->] (a) -- node {$\scriptstyle f$} (b);
\draw[->] (b) -- node {$\scriptstyle g$} (c);
\draw[->] (a) -- node[swap] {$\scriptstyle k$} (c); %CheckTikZDiagramIgnore
\end{tikzpicture}\]
\end{document}
次のようにtikzpicture環境の最初の行にCheckTikZDiagramIgnoreを描いた場合は、その環境全体が無視されます。
\begin{document}
$f\colon a\rightarrow b$,$g\colon b\rightarrow c$,$h\colon a\rightarrow c$を圏$C$の射とする.
\[\begin{tikzpicture}[auto] %CheckTikZDiagramIgnore
\node (a) at (0, 0) {$a$}; \node (b) at (1, 1) {$b$}; \node (c) at (2, 0) {$c$};
\draw[->] (a) -- node {$\scriptstyle f$} (b);
\draw[->] (b) -- node {$\scriptstyle g$} (c);
\draw[->] (a) -- node[swap] {$\scriptstyle k$} (c);
\end{tikzpicture}\]
\end{document}
tikzpicture環境内にCheckTikZDiagramDefinitionと書くと、その環境内の射は定義として採用されます。
\begin{document}
次の図式を考える.
\[\begin{tikzpicture}[auto] %CheckTikZDiagramDefinition
\node (a) at (0, 0) {$a$}; \node (b) at (1, 1) {$b$}; \node (c) at (2, 0) {$c$};
\draw[->] (a) -- node {$\scriptstyle f$} (b);
\draw[->] (b) -- node {$\scriptstyle g$} (c);
\end{tikzpicture}\]
このとき次のような$h\colon a\rightarrow c$が存在する.
\[\begin{tikzpicture}[auto]
\node (a) at (0, 0) {$a$}; \node (b) at (1, 1) {$b$}; \node (c) at (2, 0) {$c$};
\draw[->] (a) -- node {$\scriptstyle f$} (b);
\draw[->] (b) -- node {$\scriptstyle g$} (c);
\draw[->,densely dashed] (a) -- node[swap] {$\scriptstyle h$} (c);
\end{tikzpicture}\]
\end{document}
射を書く際に#1, #2, …, #9を使うと、その部分はパラメーターとして扱われます。 勿論これを普通に書いてしまうと、PDF上に意味不明な記述が載ってしまうため、 これは基本的にはコメント内に上記のCheckTikZDiagramを使用して記述します。 (書き方は設定2タブ内のパラメーター付きの射も参照)
\begin{document}
$a\in C$に対して$f_a\colon a\rightarrow K(a)$を$D$の射とする.
%CheckTikZDiagram $f_{#1}\colon #1\rightarrow K(#1)$
\[\begin{tikzpicture}[auto]
\node (a) at (0, 1) {$a$}; \node (x) at (1, 1) {$K(a)$};
\node (b) at (0, 0) {$b$}; \node (y) at (1, 0) {$K(b)$};
\draw[->] (a) -- node {$\scriptstyle f_a$} (x);
\draw[->] (b) -- node {$\scriptstyle f_b$} (y);
\end{tikzpicture}\]
\end{document}