![etoolbox 的意外行为](https://linux22.com/image/463559/etoolbox%20%E7%9A%84%E6%84%8F%E5%A4%96%E8%A1%8C%E4%B8%BA.png)
我想通过在块之间自动插入一条水平线来分隔文本块(故事),但不是在第一个块之前或最后一个块之后。我尝试通过使用 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
您想全局设置布尔值。
\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}