\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}