我有一个语法高亮程序,可以输出 LaTeX 代码。生成的代码可用于常规文本或进行tabular
更高级的布局。
生成的 LaTeX 输出\my@eol
在每行末尾包含,其本质上定义为。当然,这在常规文本中有效,但在表格中无效,因此如果我在表格中,\par
我想有条件地使用。\cr
如何检查我当前是否处于对齐状态(表格、数组、halign 等)?
最初我my@eol
根据 来定义\\
,它在表格中也有效,但基于 Barbara Beeton 在何时使用 \par,何时使用 \\、\newline 或空行我改为使用\par
。现在我需要找到一种方法来根据需要在\par
和之间切换。\cr
这是我尝试过的:我查看了的实现tabular
,发现它重新定义了\par
和\\
(后者为\@arraycr
,最终扩展为\cr
),因此一种解决方案是检查\\
或是否\par
已被重新定义,但这听起来很脆弱。我读到记录tabular
以及。
然后我查看了各种文档来源,看看 TeX 是否有任何类型的条件(如\ifvmode
),但我找不到。最后,我还查看了 TeX 源代码中(它调用)
的实现,但我没有发现任何直接相关的东西(它似乎只是在输入时更改为并设置,但我不确定如何从 TeX 访问)。\halign
init_align
vmode
align_state
halign
align_state
答案1
要查看您当前所处的环境,您可以查看 的值\@currenvir
:在tabular
或array
环境等中,它将分别是tabular
或array
。这不适用于\halign
。嵌套环境也不会被检测到,但这在您的用例中可能没问题。
为了进行这些测试,我认为最简单的方法是\str_case:onF
使用LaTeX3。下面的代码定义了一个命令\IfInTableTF
,您可以使用它:
\IfInTableTF{true code}{false code}
这个名字可能不是最好的名字,因为array
、tabular
和tabularx
环境的测试结果都是正面的。该命令所做的就是定义一个新的布尔值,然后\str_case:onF
如果我们处于我们最喜欢的环境之一中,则使用它来打开它,否则将其关闭。以下是代码:
\documentclass{article}
\usepackage{expl3}
\makeatletter
\ExplSyntaxOn
\bool_new:N \l_clement_if_in_table_bool% a boolean for table manners
\newcommand\IfInTableTF[2]
{
\str_case:onF { \@currenvir }% check current environment
{
{array} { \bool_set_true:N \l_clement_if_in_table_bool }
{tabular} { \bool_set_true:N \l_clement_if_in_table_bool }
{tabularx} { \bool_set_true:N \l_clement_if_in_table_bool }
}{ \bool_set_false:N \l_clement_if_in_table_bool }
\bool_if:NTF \l_clement_if_in_table_bool {#1} {#2}
}
\ExplSyntaxOff
\makeatother
\begin{document}
\IfInTableTF{in table}{Not in table}
\begin{tabular}{c}
one \\
two \\
\IfInTableTF{in table}{Not in table}
\end{tabular}
\[
\begin{array}{c}
1 \\
2 \\
\IfInTableTF{in array}{Not in array}
\end{array}
\]
\IfInTableTF{in table}{Not in table}
\end{document}
预期输出如下:
答案2
\ifvoid\@arstrutbox
不管对齐下的嵌套深度有多深,该测试似乎都能很好地检测表格或数组内部的情况。
\newcommand\IfInTableTF{\ifvoid\@arstrutbox
\expandafter\@secondoftwo\else
\expandafter\@firstoftwo\fi}
其他候选者可能是,\ifx\\\@arraycr
但可能会被\raggedright
;和所欺骗\@ifundefined{@preamble}
,但有些包在不使用时会留下空定义。
(tabu 包确实进行了全局设置,\@arstrutbox
但在不使用时似乎明确将其设置为无效。)