不完整的 \ifodd;行后的所有文本都被忽略

不完整的 \ifodd;行后的所有文本都被忽略

我在使用时遇到了很多麻烦\ifodd。我想制作一个粗线和细线交替的图案,我试过几种方法,但都不起作用。

使用这种结构


\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}

\begin{document}
\begin{tikzpicture}[remember picture,overlay,shorten >= -10pt]

    \coordinate (aux1) at ([xshift=-25mm, yshift=-30mm]current page.north east);
    \coordinate (aux2) at ([xshift=-25mm, yshift=30mm]current page.south east);
    \coordinate (aux3) at ([xshift=25mm, yshift=-30mm]current page.north west);
    \coordinate (aux4) at ([xshift=25mm, yshift=30mm]current page.south west);
    
    \begin{scope}[black]
        \foreach \i [evaluate =\i as \x using int(\i)] in {0, ..., 4}{
            \draw["\ifodd \x line width=1pt \else line width=2pt \fi" ]([
                    xshift=\x mm,
                    yshift=-65mm
                ]aux1)
                -- 
                ([
                    xshift=\x mm,
                    yshift=10mm]
                aux2);
        }
        
    \end{scope}
\end{tikzpicture}

\end{document}

我努力了


\foreach \x in {0, ..., 4}{
    \draw["\ifodd \x line width=1pt \else line width=2pt \fi" ]([
}
\foreach \x in {0, ..., 4}{
    \draw["\ifodd \num{\x} line width=1pt \else line width=2pt \fi" ]([
}
\foreach \x in {0, ..., 4}{
    \draw["\ifodd \value{\x} line width=1pt \else line width=2pt \fi" ]([
}
\foreach \i [evaluate =\i as \x using int(\i)] in {0, ..., 4}{
    \draw["\ifodd \x line width=1pt \else line width=2pt \fi" ]([
}

注意:我想学习如何在循环中使用 \ifodd

答案1

您的代码有几个问题。第一个问题是使用“独立”文档类,节点相对于当前页面的角落定位(但对于独立文档,页面的尺寸不是固定的)。这会导致“尺寸太大”错误(注释以 开头的行\draw,您会得到一个非常大的文档:宽度为 12.13 厘米,575.84 厘米高度!)

首先我们替换独立经过文章

小问题(非阻塞),坐标“aux3”和“aux4”未被使用,因此我们将其擦除。

第二个问题与该行的语法有关\draw["\ifodd \x line width=1pt \else line width=2pt \fi" ]([

首先,忘记引号",这是一个错误的语法。

其次,如果您在删除后尝试"\ifodd \x line width=1pt \else line width=2pt \fi仍然不起作用。

\ifodd \x red\else blue\fi作品。

事实上,如果你在真代码假代码,就像\ifodd \x{line width=1pt}\else{line width=2pt}\fi你收到类似这样的错误消息我不知道键“/tikz/line width=2pt”并且我将忽略它。索蒂Zline width=1pt视为钥匙,而不是钥匙=价值

该问题似乎与字符有关=,但是我在 TeXbook 或 TeX by Topic 中都没有找到关于“保护”它们的解释,但我可能没有搜索到好的词来找到解释。

一个解决方案是从条件测试中输出“=”。

line width=\ifodd \x {1pt} \else 2pt\fi作品。

如果没有括号1pt,则会出现错误包 PGF 数学错误:未知函数“pt”(在“pt”中)。

笔记:比使用括号更好的是1pt,我们可以使用\spacebetween\ifodd \x1pt(感谢 Skillmon,在问题的评论中)。

编辑:您还可以直接使用\i进行测试并作为水平偏移的维度(因此您可以在命令中抑制和[evaluate =\i as \x using int(\i)]替换)。xshift=\x mm,xshift=\i mm,\draw

更正后的代码(我还修改了yshift绘制命令中的尺寸,因此线条垂直居中):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}

\begin{document}
\begin{tikzpicture}[remember picture,overlay]

    \coordinate (aux1) at ([xshift=-25mm, yshift=-30mm]current page.north east);
    \coordinate (aux2) at ([xshift=-25mm, yshift=30mm]current page.south east);
    
    \begin{scope}[black]
        \foreach \i in {0, ..., 4}{
            \draw[line width=\ifodd \i\space 1pt\else 2pt\fi]([
                    xshift=\i mm,
                    yshift=0mm
                ]aux1)
                -- 
                ([
                    xshift=\i mm,
                    yshift=0mm]
                aux2);
        }
        
    \end{scope}
\end{tikzpicture}

\end{document}

输出(左:整个文档,右:放大):

在此处输入图片描述

答案2

您不能用条件来括住选项。

我不确定你为什么\x这样定义,因为\i 一个整数。

它比这更简单:使用\pgfmathifthenelse

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}

\begin{document}
\begin{tikzpicture}[
%  remember picture,
%  overlay,
  shorten >= -10pt
]
  \coordinate (aux1) at ([xshift=-25mm, yshift=-30mm]current page.north east);
  \coordinate (aux2) at ([xshift=-25mm, yshift=30mm]current page.south east);
  \coordinate (aux3) at ([xshift=25mm, yshift=-30mm]current page.north west);
  \coordinate (aux4) at ([xshift=25mm, yshift=30mm]current page.south west);
    
  \begin{scope}[black]
    \foreach \i in {0, ..., 4}{
      \pgfmathifthenelse{isodd(\i)}{1}{2}
      \draw[line width=\pgfmathresult pt]
        ([xshift=\i mm,yshift=-65mm]aux1)
        -- 
        ([xshift=\i mm,yshift=10mm]aux2);
    }
  \end{scope}
\end{tikzpicture}

\end{document}

在此处输入图片描述

正如 Qrrbrbirlbel 在评论中指出的那样,你可以更简单地这样做

      \draw[line width=isodd(\i) ? 1pt : 2pt]

省略此\pgfmathifhenelse行。

或者你可以使用expl3

\ExplSyntaxOn
\NewExpandableDocumentCommand{\isoddTF}{mmm}
 {
  \int_if_odd:nTF { #1 } { #2 } { #3 }
 }
\ExplSyntaxOff

在序言和

     \draw[line width=\isoddTF{\i}{1pt}{2pt}]

在 的正文中tikzpicture

相关内容