etoolbox 的意外行为

etoolbox 的意外行为

我想通过在块之间自动插入一条水平线来分隔文本块(故事),但不是在第一个块之前或最后一个块之后。我尝试通过使用 etoolbox 创建一个标志来指示当前块是否是第一个块来实现这一点,但这似乎不起作用。布尔值似乎总是计算为 false。我在下面提供了一个简单的示例,其中的文本是“BETWEEN STORIES”,而不是 hrule。

\documentclass{article}

\usepackage{etoolbox}

\newbool{didonestory}

\newenvironment{stories}{\boolfalse{didonestory}}{}
\newenvironment{story}{
    \ifbool{didonestory}{BETWEEN STORIES}{}
}{
    \booltrue{didonestory}
}

\begin{document}
\begin{stories}
    \begin{story}
        Test 1
    \end{story}
    \begin{story}
        Test 2
    \end{story}
\end{stories}
\end{document}

这里我期望输出是“测试 1 BETWEEN STORIES 测试 2”,但输出却只是“测试 1 测试 2”。

我的问题是:

  1. 我对布尔值做错了什么?
  2. 有没有更标准的方法来实现我想要的?

答案1

您想全局设置布尔值。

\documentclass{article}

\usepackage{etoolbox}

\newbool{didonestory}

\newenvironment{stories}{\global\boolfalse{didonestory}}{}
\newenvironment{story}{%
    \ifbool{didonestory}{BETWEEN STORIES}{}%
}{%
    \global\booltrue{didonestory}%
}

\begin{document}
\begin{stories}
    \begin{story}
        Test 1
    \end{story}
    \begin{story}
        Test 2
    \end{story}
\end{stories}
\end{document}

在此处输入图片描述

答案2

您正在组中将布尔值设置为 true。在环境之后执行以下操作:

\documentclass{article}

\usepackage{etoolbox}

\newbool{didonestory}

\newenvironment{stories}{\boolfalse{didonestory}}{}
\AddToHook{env/story/after}{\booltrue{didonestory}}
\newenvironment{story}{\ifbool{didonestory}{BETWEEN STORIES}{}}{}

\begin{document}
\begin{stories}
    \begin{story}
        Test 1
    \end{story}
    \begin{story}
        Test 2
    \end{story}
\end{stories}
\end{document}

在此处输入图片描述

相关内容