在tblr里面执行逻辑操作的时候遇到了问题:
计数器MWE:
\documentclass[zihao=-4,a4paper,punct=kaiming,oneside]{ctexart}
\usepackage{tabularray}
\UseTblrLibrary{counter}
% % 逻辑页计数器
\newcounter{lfrmc}
\setcounter{lfrmc}{0}
\NewExpandableDocumentCommand{\spl}{}
{%
\thelfrmc%
\addtocounter{lfrmc}{1}
}
\NewExpandableDocumentCommand{\lfrmh}{}
{%
empty&ok&\spl\\
}
\begin{document}
\begin{longtblr}[expand=\expanded]{
colspec={|X|X|X|}
}
\expanded{\lfrmh}
\expanded{\lfrmh}
\expanded{\lfrmh}
a&b&c\\\hline
\end{longtblr}
最右边一列希望是:0、1、2……递增
\end{document}
更新对问题(1)的一个解答:
\documentclass[zihao=-4,a4paper,punct=kaiming,oneside]{ctexart}
% \input{pkg.tex}
\usepackage{xeCJK}
\usepackage{xeCJKfntef}
\usepackage{xcolor}
\usepackage{tabularray}
\UseTblrLibrary{booktabs}
\UseTblrLibrary{varwidth}
\UseTblrLibrary{counter}
% \input{tuning.tex}
\ExplSyntaxOn
\tl_new:N \g_ttle_tl
\NewDocumentCommand{\ttle}{o m}
{
\tl_set:Nx \g_ttle_tl {#2}
}
\NewDocumentCommand{\sttle}{}
{
\tl_use:N \g_ttle_tl
}
\ExplSyntaxOff
% \input{tblr.tex}
% % 逻辑页计数器
\newcounter{lfrmc}
\setcounter{lfrmc}{0}
\NewExpandableDocumentCommand{\spl}{}
{%
\thelfrmc%
\addtocounter{lfrmc}{1}
}
\NewExpandableDocumentCommand{\lfrmh}{}
{%
empty&{\sttle\\nothing~here!}&\spl\\
}
\begin{document}
\begin{longtblr}[expand=\expanded]{
colspec={|X|X|X|}
}
\ttle[1]{tblr标题}%
\expanded{\lfrmh}
\expanded{\lfrmh}
1&2&3\\\hline
\end{longtblr}
\ttle[0]{第一个标题}
\sttle
\ttle[1]{第两个标题}
\sttle
\end{document}
上面是mwe,完整的源代码如下文件:
在写一个演讲稿模板,已经基本全部写完,但是……
在tblr里面执行逻辑操作的时候遇到了问题
考古...
参考自QQ群里Eureka老师给的回答,请看下面的对比。
当然,OP原问题给的代码过长了,提问应该尽量保证代码“最简短”,避免增加阅读障碍。
输出latex3
变量和计数器问题显然应该另开两个问题,这样很容易让后来的读者感到混乱迷惑,削弱论坛的信息共享作用。
可以比较下面的例子:
\documentclass{article}
\usepackage{tabularray}
\UseTblrLibrary{counter}
\newcounter{cntA}
\newcounter{cntB}
\NewExpandableDocumentCommand{\cmdA}{}
{%
\thecntA%
\addtocounter{cntA}{1}
}
\NewExpandableDocumentCommand{\cmda}{}
{%
okA&\cmdA\\
}
\newcommand{\cmdB}{%
\thecntB%
\addtocounter{cntB}{1}
}
\newcommand*{\cmdb}{%
okB&\cmdB\\
}
\setlength{\parindent}{0pt}
\begin{document}
\begin{tblr}[expand=\expanded]{colspec={|X|X|}}
\expanded{\cmda}
\expanded{\cmda}
\expanded{\cmda}
\end{tblr}
\bigskip
\begin{tblr}[expand=\cmdb]{colspec={|X|X|}}
\cmdb
\cmdb
\cmdb
\end{tblr}
\end{document}
在tblr
以及longtblr
环境中,有两种展开方式:
expand=<expandable token>
,将直接展开一次expand=\expanded
后在tblr
内部使用\expanded{<expandable token>}
进行完全(exhaustive)展开(e-type
展开)而虽然\newcommand
与\NewExpandableDocumentCommand
定义的命令均可展开,但:
\newcommand
允许只执行部分展开\NewExpandableDocumentCommand
要求只能被完全展开而同时\addtocounter
实际上是TeX
原语\advance
将\value{cnt}
的+1
:
\addtocounter:
macro:#1#2->\@ifundefined {c@#1}{\@nocounterr {#1}}{\global \advance \csname c@#1\endcsname #2\relax }
这是一种assignment过程,属于不可展开的命令,他们因此不应该被放在\NewExpandableDocumentCommand
内部。若如此做,将导致该命令变为不可展开类型。
因此在OP的原问题中,tblr
环境将会先搜集其内部的所有命令,然后再执行展开\NewExpandableDocumentCommand
定义的\cmd
(但此时不可展开)。此时使用\expanded{\cmd}
将导致直接进行e-type
展开将\thecnt
完全展开为初始值0
.
因此洞察到\addtocounter
不可展开,同时在这一情形下仅需要单步展开,决定了应该使用\newcommand
以及\expand=\cmd
实现.
这个问题已经解决了。群里有说过。发现是tblr包的版本低了,升级之后就可以绕过限制(设置expand多个命令)
@u115385 哈哈确实(其实当时应该也有个问题是
\newcommand
和文档里\NewExpandableDocumentCommand
的区别)从论坛问题的角度。补充完整会更好点,以上。