如果则否则奇数页/偶数页

如果则否则奇数页/偶数页

如何在 LaTeX 中使用 if-then-else 结构?我需要奇数页和偶数页的示例。

if odd then
  command 1
else
  command 2

答案1

您可以使用changepage包中,一个最小的工作示例是

\documentclass{article}
\usepackage[strict]{changepage}
\begin{document}

\checkoddpage
\ifoddpage odd\else even\fi

\newpage
\checkoddpage
\ifoddpage odd\else even\fi

\newpage
\checkoddpage
\ifoddpage odd\else even\fi

\end{document}

如果您使用该类memoir,那么此功能将自动内置,但您应该\strictpagecheck在序言中写入以使测试更加健壮。

请注意,如果\checkoddpage介于两页之间,即使启用了严格模式,测试结果仍可能错误。例如,您写完一个段落,位于第 4 页末尾,写入内容,\checkoddpage结果为 false,然后插入内容,结果跳转到下一页。在这种情况下,您需要写入\leavevmode\checkoddpage或以某种方式将检查放入接下来要排版的内容中,而不是在它之前。

然而,大多数时候\checkoddpage这种情况并不是什么问题,所以不应该成为一个主要问题。

答案2

为了完整起见:KOMA 脚本提供命令\ifthispageodd{<true>}{<false>}。它可以通过加载在标准类中使用它scrextend

\documentclass{article}
\usepackage{scrextend}

\begin{document}
\pagenumbering{roman}
\ifthispageodd{I'm odd}{I'm even}% I'm odd
\newpage
\ifthispageodd{I'm odd}{I'm even}% I'm even
\newpage
\pagenumbering{arabic}
\ifthispageodd{I'm odd}{I'm even}% I'm odd
\newpage
\ifthispageodd{I'm odd}{I'm even}% I'm even
\end{document}

memoir还提供了类似的条件\ifoddpage ... \else ... \fi,需要在前面加上\checkoddpage。另外还应调用\strictpagecheck以便将页码写入aux文件。

\documentclass{memoir}
\strictpagecheck
\makeatletter
\newcommand*\ifthispageodd{%
  \checkoddpage
  \ifoddpage
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
\makeatother
\begin{document}
\pagenumbering{roman}
\ifthispageodd{I'm odd}{I'm even}% I'm odd
\newpage
\ifthispageodd{I'm odd}{I'm even}% I'm even
\newpage
\pagenumbering{arabic}
\ifthispageodd{I'm odd}{I'm even}% I'm odd
\newpage
\ifthispageodd{I'm odd}{I'm even}% I'm even
\end{document}

答案3

正如 Harald 已经指出的那样,使用\thepage并不能万无一失地确定我们是在偶数页还是奇数页。试试 Ryan 示例的这个扩展版本:

\documentclass{article}
\usepackage{ifthen}
\newcounter{mycount}

\begin{document}
\noindent\whiledo{\themycount<130}{%
  \ifthenelse{\isodd{\thepage}}%
    {Odd\\}%
    {Even\\}%
  \stepcounter{mycount}%
}
\end{document}

你会在每一页上看到“奇怪”这个词。

相反,使用\label+\pageref方法更安全:

\documentclass{article}
\usepackage{ifthen}
\newcounter{mycount}

\begin{document}
\noindent\whiledo{\themycount<130}{%
  \label{mylabel\themycount}%
  \ifthenelse{\isodd{\pageref{mylabel\themycount}}}%
    {Odd\\}%
    {Even\\}%
  \stepcounter{mycount}%
}
\end{document}

答案4

\label也可以使用-方法检查页码\ref。下面我使用可扩展\getpagerefnumberrefcount以页码为条件:

\documentclass{article}
\usepackage{refcount}% http://ctan.org/pkg/refcount
\newcounter{oddpagecheck}
\makeatletter
\newcommand{\ifoddpage}{% \ifoddpage{<odd>}{<even>}
  \stepcounter{oddpagecheck}% For unique labels
  \label{opc-\theoddpagecheck}% Place label
  \ifodd\getpagerefnumber{opc-\theoddpagecheck}
    \expandafter\@firstoftwo% Page is odd
  \else
    \expandafter\@secondoftwo% Page is not odd (even)
  \fi}
\makeatother
\begin{document}
\ifoddpage{odd}{even}
\end{document}

由于这使用了\label-\ref系统,您需要至少编译两次每当标签移动的时候。

相关内容