LaTeX / TikZで Warning “⚠ Missing character: There is no ; in font nullfont! LaTeX[Ln 1, Col1]”

Missing Character LaTeX
Missing Character

概要

LaTeX / TikZでコンパイルは通るのに消せないワーニング。これを調べてみた。

⚠ Missing character: There is no ; in font nullfont! LaTeX[Ln 1, Col1]

結論からいうとTikZではコマンドにセミコロンが必要ということだったが、\tikzsetには不要だった。正確にいうと、tikzpicture環境内(\begin{tikzpicture}~\end{tikzpicture})のコマンドにはセミコロンが必要だが、\tikzsetはtikzpicture環境に含めるコマンドではなかった。

コード

このようなコードを書いていたところ、1行目でワーニングが出た。

\documentclass[dvipdfmx]{article}
\usepackage{tikz}
\usetikzlibrary{shapes}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
    \tikzset{Rect/.style={rectangle, draw}};
    \tikzset{RRect/.style={rounded rectangle, draw}};
    \node[Rect](a){Rect};
    \node[RRect, below= of a](b){RRect};
\end{tikzpicture}
\end{document}

コンパイルは通るので次のような文書ができあがる。

VScodeでの表示は次のとおり。

下記のWarningが2つ出ていた。

⚠ Missing character: There is no ; in font nullfont! LaTeX[Ln 1, Col1]

ワーニング発生源の特定

まず、tikzpicture環境を消去するとこのワーニングは消えた。この中に問題があるのは間違いない。次にtikzpicture環境を戻して、その中の\node行を消しても消えなかった。続いて\tikzset行を消すと消えた。\tikzset行に問題があることは確定。ワーニングの文章から、\tikzsetの行末のセミコロンを消すとワーニングが出なくなった。「TikZのコマンドにはセミコロンが必要」のはずがなぜ?\tikzsetだけは不要なのか?

tikzsetにはセミコロンが不要なのか

tikzsetでググって出てきたこちらのページ、Hierarchical Structures: Package, Environments, Scopes, and Styles – PGF/TikZ Manual。ここによると、

All TikZ commands should be given inside this environment, except for the \tikzset command. You cannot use graphics commands like the low-level command \pgfpathmoveto outside this environment and doing so will result in chaos. For TikZ, commands like \path are only defined inside this environment, so there is little chance that you will do something wrong here.

なるほどね。tikzpicture環境内のコマンドにはセミコロンが必要だが、そもそも\tikzsetはtikzpicture環境に入れるものではなかったということだ。

修正後、次のコードでWarningがなくなった。

\documentclass[dvipdfmx]{article}
\usepackage{tikz}
\usetikzlibrary{shapes}
\usetikzlibrary{positioning}
\begin{document}
\tikzset{Rect/.style={rectangle, draw}}
\tikzset{RRect/.style={rounded rectangle, draw}}
\begin{tikzpicture}
    \node[Rect](a){Rect};
    \node[RRect, below= of a](b){RRect};
\end{tikzpicture}
\end{document}

まとめ

tikzpicture環境内ではコマンド終端にセミコロンが必要だが、\tikzsetはtikzpicture環境内のコマンドではないのでセミコロンが不要。

参考サイト

コメント

タイトルとURLをコピーしました