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