\obeylines 在 Expl3 条件中不起作用

\obeylines 在 Expl3 条件中不起作用

\obeylines当它在条件语句中出现时我会遇到麻烦expl3,但在正常的 TeX 条件语句中却没有问题。

发生了什么事?我能expl3以某种方式改变条件以使其起作用吗?

平均能量损失

\documentclass{article}
\ExplSyntaxOn
\int_new:N \l__dcp_tmp_int
\int_set_eq:NN \l__dcp_tmp_int \c_one_int
\prg_new_protected_conditional:Npnn \__dcp_if_tmp_one: { T }
  {
    \if_int_compare:w \l__dcp_tmp_int = \c_one_int
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_set_eq:NN \ifdcptmpone \__dcp_if_tmp_one:T
\ExplSyntaxOff
\newcount\dcptmpint
\dcptmpint=1
\begin{document}
\begingroup
\ifdcptmpone{%
  \obeylines
  Yes,
  tmp
  $=$
  one
}
\endgroup

\medskip

\begingroup
\ifnum\dcptmpint=1\relax
  \obeylines
  Yes,
  tmp
  $=$
  one
\fi
\endgroup
\end{document}

输出

输出

答案1

我无法理解您在宏的 Expl3 部分中解决的问题(因为我无法读懂)但如果您坚持使用语法,\ifdcptmpone{\obeylines ...}那么您可以按如下方式执行此操作:

\newcount\dcptmpint
\dcptmpint=1

\def\ifdcptmpone{\ifnum\dcptmpint=1 \else \expandafter\ignoreit \fi}
\def\ignoreit#1{}

\ifdcptmpone{%
  \obeylines
  Yes,
  tmp
  $=$
  one
}

答案2

与 expl3 无关。扫描参数时,所有行的结尾都会产生空格标记,因此在执行主体时\obeylines没有要遵循的行。

\obeylines扫描参数前需要进行设置:

\documentclass{article}
\ExplSyntaxOn
\int_new:N \l__dcp_tmp_int
\int_set_eq:NN \l__dcp_tmp_int \c_one_int
\prg_new_protected_conditional:Npnn \__dcp_if_tmp_one: { T }
  {
    \if_int_compare:w \l__dcp_tmp_int = \c_one_int
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_new:Npn \__dcp_if_tmp_two:Nn#1#2{
\__dcp_if_tmp_one:T#1{#2}
\endgroup}

\cs_new:Npn \ifdcptmpone{
\begingroup
\obeylines
\__dcp_if_tmp_two:Nn
}

\ExplSyntaxOff
\newcount\dcptmpint
\dcptmpint=1
\begin{document}
\ifdcptmpone{%
  Yes,
  tmp
  $=$
  one
}

\medskip

\begingroup
\ifnum\dcptmpint=1\relax
  \obeylines
  Yes,
  tmp
  $=$
  one
\fi
\endgroup
\end{document}

答案3

给 TeX -条件之外的命令赋予\newif以 开头的名称\if..是一种不好的做法,因为当在\if.. ... \else ... \fi-表达式 内嵌套此类命令时,您很容易对正确的\if..- \else- -\fi嵌套感到困惑。

这就是为什么在下面的例子中命令没有被命名\ifdcptmpone而是被命名为\doifdcptmpone


正如用户202729的评论您可以将\ifdcptmpone其参数作为 vebatim 参数 ( +v-type) 读取,并用于\scantokens重新扫描它 - 只需\newlinechar=\endlinechar在调用之前设置\scantokens以确保结束符导致\scantokens' fake-file-writing-part 继续在新行中写入:

\documentclass{article}
\ExplSyntaxOn
\int_new:N \l__dcp_tmp_int
\int_set_eq:NN \l__dcp_tmp_int \c_one_int
\prg_new_protected_conditional:Npnn \__dcp_if_tmp_one: { T }
  {
    \if_int_compare:w \l__dcp_tmp_int = \c_one_int
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }

% let's also do s.th. about horizontal-tab which wouldn't be treated correctly by +v-type otherwise:
%
\NewDocumentCommand \doifdcptmpone {} {\group_begin: \char_set_catcode_other:N \^^I  \doifdcptmponeinner}

\group_begin:
\char_set_catcode_other:N \%
\use:n {
  \group_end:
  \NewDocumentCommand \doifdcptmponeinner {+v} {\group_end: \__dcp_if_tmp_one:T {\begingroup\newlinechar=\endlinechar\scantokens{\endgroup~#1%} } }
}
\ExplSyntaxOff
\newcount\dcptmpint
\dcptmpint=1
\begin{document}
\begingroup
\doifdcptmpone{%
  \obeylines
  Yes,
  tmp
  $=$
  one
}
\endgroup

\medskip

\begingroup
\ifnum\dcptmpint=1\relax
  \obeylines
  Yes,
  tmp
  $=$
  one
\fi
\endgroup
\end{document}

在此处输入图片描述

相关内容