为什么我的布尔值不能正常工作?

为什么我的布尔值不能正常工作?

抱歉,问题标题太开放了,但我真的不知道到底哪里出了问题。我想在编写语义类型时节省一点时间,这些类型通常是下标,但通常是递归的,导致类型中的类型,如下所示:

D <e,<s,t>>

在我看来,最简单的解决方案是使用布尔值来检查我是否已经在 Type Brackets (<>) 中;如果是,\type 将不使用 \textsubscript,如果不是,\type 将把布尔值设置为 true 并使用 \textsubscript;如果在调用命令时布尔值为 false,则 \type 中的最后一个命令会将布尔值设置为 false。这是一个最小示例:

\documentclass{article}
\usepackage{etoolbox}

\newbool{intype}
\newcommand{\type}[1]{\ifbool{intype}{$\langle$#1$\rangle$}{\setbool{intype}{true}\textsubscript{$\langle$#1$\rangle$}}\setbool{intype}{false}}

\begin{document}
D\type{\type{$\tau$,\type{$s,t$}},\type{$\tau$,\type{$s$,$t$}}}
\end{document}

预期输出为 D <<τ,<s,t>>,<τ,<s,t>>

我得到的输出是 D <<τ,<s,t>>, <τ,<s,t>>

这确实令人困惑——如果我的解决方案不起作用,为什么第一对括号中的 <s,t> 位不低于 τ?

顺便说一句,很抱歉代码太长,据我所知,添加空格或换行符会在输出中产生不需要的空格。

答案1

您将其设置为 false 太早了,但您可以使用分组将其自动设置回来:

在此处输入图片描述

\documentclass{article}
\usepackage{etoolbox}

\newbool{intype}
\newcommand{\type}[1]{%
  \ifbool{intype}%
  {$\langle$#1$\rangle$}%
  {\textsubscript{\setbool{intype}{true}$\langle$#1$\rangle$}}%
  }

\begin{document}
D\type{\type{$\tau$,\type{$s,t$}},\type{$\tau$,\type{$s$,$t$}}}
\end{document}

答案2

布尔值在错误的地方被设置为 false。

这是基于分组的另一种实现,可以避免代码重复。由于将其参数排版为一个组,因此一旦下标排版完成,\textsubscript的“外部”定义就会恢复。\type

\documentclass{article}

\newcommand{\type}[1]{%
  \textsubscript{\let\type\innertype\innertype{#1}}%
}
\newcommand{\innertype}[1]{$\langle$#1$\rangle$}

\begin{document}
D\type{\type{$\tau$,\type{$s,t$}},\type{$\tau$,\type{$s$,$t$}}}
\end{document}

图像

相关内容