有没有办法检查我们是否在表内?

有没有办法检查我们是否在表内?

我有一个语法高亮程序,可以输出 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 访问)。\haligninit_alignvmodealign_statehalignalign_state

答案1

要查看您当前所处的环境,您可以查看 的值\@currenvir:在tabulararray环境等中,它将分别是tabulararray。这不适用于\halign。嵌套环境也不会被检测到,但这在您的用例中可能没问题。

为了进行这些测试,我认为最简单的方法是\str_case:onF使用LaTeX3。下面的代码定义了一个命令\IfInTableTF,您可以使用它:

\IfInTableTF{true code}{false code}

这个名字可能不是最好的名字,因为arraytabulartabularx环境的测试结果都是正面的。该命令所做的就是定义一个新的布尔值,然后\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但在不使用时似乎明确将其设置为无效。)

相关内容