TikZを使用すると奇妙な動作が発生します評価する構文。
下の対角線が他の 3 本よりも短いのがわかりますか? これは望ましい動作ではありません。上の画像のコードは次のとおりです。
\documentclass{memoir}
\usepackage{tikz}
\begin{document}
\[
\begin{tikzpicture}
\foreach \x in {0,...,4}
{\node (X\x) at (0,\x) {$\bullet$};
}
\foreach \x in {0,...,4}
{\node (Y\x) at (3,\x) {$\bullet$};
}
% start weirdness
\draw (X0) -- (Y1);
\foreach \x [evaluate=\x as \sx using \x+1] in {1,...,3}
{
\draw (X\x) -- (Y\sx);
}
% end weirdness.
% Comment out the above weirdness and uncomment out the following:
% \draw (X0) -- (Y0);
% \foreach \x [evaluate=\x as \sx using \x] in {1,...,3}
% {
% \draw (X\x) -- (Y\sx);
% }
\end{tikzpicture}
\]
\end{document}
「start weirdness」と「end weirdness」の間の行をコメントアウトし、最後の 5 行のコメントアウトを解除すると、問題が魔法のように解決され、すべての行が同じに見えることがわかります。
もう一度言いますが、元のコードとこの投稿の先頭にある関連画像では、望ましい動作は短い行です。他の 3 つは望ましくありません。望ましい動作を実現できるよう、手伝っていただけますか?
ありがとう!
答え1
私のコメントに書いたように\x+1
、int
\foreach \x [evaluate=\x as \sx using {int(\x+1)}] in {1,...,3}
{
\draw (X\x) -- (Y\sx);
}
そうでなければ、 のような数値が得られ2.0
、 は.0
アンカーとして解釈されます。.0
は(この場合)東のアンカーと一致し、角度は 0 です。出力には、それぞれのY
型ノードの東のアンカーに接続する線が表示されます。なぜ2番目のループでは問題が発生しないのか不思議に思うかもしれません。これは、次のようにすると、
evaluate=\x as \sx using \x
ティけZ は式を解析する必要がないため、を追加しません.0
。
\documentclass{memoir}
\usepackage{tikz}
\begin{document}
\[
\begin{tikzpicture}
\foreach \x in {0,...,4}
{\node (X\x) at (0,\x) {$\bullet$};
}
\foreach \x in {0,...,4}
{\node (Y\x) at (3,\x) {$\bullet$};
}
% start weirdness
\draw (X0) -- (Y1);
\foreach \x [evaluate=\x as \sx using {int(\x+1)}] in {1,...,3}
{
\draw (X\x) -- (Y\sx);
}
\end{tikzpicture}
\quad\mbox{vs.}\quad
\begin{tikzpicture}
% end weirdness.
% Comment out the above weirdness and uncomment out the following:
\foreach \x in {0,...,4}
{\node (X\x) at (0,\x) {$\bullet$};
}
\foreach \x in {0,...,4}
{\node (Y\x) at (3,\x) {$\bullet$};
}
\draw (X0) -- (Y0);
\foreach \x [evaluate=\x as \sx using \x] in {1,...,3}
{
\draw (X\x) -- (Y\sx);
}
\end{tikzpicture}
\]
\end{document}
\x
ところで、は によっても使用されるため、ループ変数として使用することは避けた方がよいでしょう。つまり、をループでcalc
使用すると、他の「奇妙な」ことが見つかるかもしれません。ギャップをなくしたい場合は、 Ti でノードを描画するだけで済みます。calc
\x
けZ.
\documentclass{memoir}
\usepackage{tikz}
\begin{document}
\[
\begin{tikzpicture}[bullet/.style={circle,fill,inner sep=2pt}]
\path foreach \Y in {0,...,4}
{(0,\Y) node[bullet] (X\Y){}
(3,\Y) node[bullet] (Y\Y) {}
};
\foreach \X [evaluate=\X as \Y using {int(\X+1)}] in {0,...,3}
{
\draw (X\X) -- (Y\Y);
}
\end{tikzpicture}
\]
\end{document}
スティーブン・B・セゲレッツは、\the\numexpr
これは問題なく動作しますが、まったく必要ありませんevaluate
。
\documentclass{memoir}
\usepackage{tikz}
\begin{document}
\[
\begin{tikzpicture}[bullet/.style={circle,fill,inner sep=2pt}]
\path foreach \Y in {0,...,4}
{(0,\Y) node[bullet] (X\Y){}
(3,\Y) node[bullet] (Y\Y) {}
};
\foreach \X in {0,...,3}
{
\draw (X\X) -- (Y\the\numexpr\X+1);
}
\end{tikzpicture}
\]
\end{document}
答え2
tikz
確かにやり方はあると思いますが、\x+1
必要な評価は終了したので、積分なので を使用しました\numexpr
。
\documentclass{memoir}
\usepackage{tikz}
\begin{document}
\[
\begin{tikzpicture}
\foreach \x in {0,...,4}
{\node (X\x) at (0,\x) {$\bullet$};
}
\foreach \x in {0,...,4}
{\node (Y\x) at (3,\x) {$\bullet$};
}
% start weirdness
\draw (X0) -- (Y1);
\foreach \x [evaluate=\x as \sx using \the\numexpr\x+1\relax] in {1,...,3}
{
\draw (X\x) -- (Y\sx);
}
% end weirdness.
% Comment out the above weirdness and uncomment out the following:
% \draw (X0) -- (Y0);
% \foreach \x [evaluate=\x as \sx using \x] in {1,...,3}
% {
% \draw (X\x) -- (Y\sx);
% }
\end{tikzpicture}
\]
\end{document}