我想将一些文本保存在一个全局变量中,我将其用作 的内容tabular
。我使用expl3
和tikz
来放置tabular
。问题是在 expl3 环境中,tikz 无法按预期工作。
在阅读了类似问题的解决方案后,我的代码开始运行。
\documentclass{beamer}
\mode<presentation>
\usepackage{tikz,tabularray}
\ExplSyntaxOn
\tl_new:N \tl_tmpa
\ExplSyntaxOff
\ExplSyntaxOn
\NewDocumentCommand{\mycontent} { m }
{
\tl_clear:N \tl_tmpa
\tl_put_right:Nn \tl_tmpa {
\begin{tblr}{|l|}
\hline
#1
\hline
\end{tblr}
}
\let\mytikznode\tl_tmpa
}
\ExplSyntaxOff
\NewDocumentCommand{\myframe} {}
{
\begin{frame}
\begin{tikzpicture}[remember picture,overlay]
\node at (current page.north)
[shift={(0,-4)}, anchor=north]{
\mytikznode
};
\end{tikzpicture}
\end{frame}
}
\begin{document}
\mycontent{ a a a \\
b b b \\}
\myframe
\end{document}
如果我把这两个语句移进去\begin{tblr}{|l|}
并离开\end{tblr}
\myframe
\hline
#1
\hline
如果\mycontent
不做任何事情,构建就会失败。同样,如果不做\let\mytikznode\tl_tmpa
,而是使用\tl_tmpa
而不是\mytikznode
构建\myframe
就会失败。我仍然不明白问题出在哪里。我发布它是为了获得一些清晰度,如果可能的话,让代码更简洁。
答案1
嵌套越深,扩展时就越需要谨慎。在这种情况下,您需要在tblr
解析环境内容之前对其进行扩展。该tabularray
包提供了一个expand
选项,专门用于这种情况(请参阅第 3.2.3 节“首先扩展宏”)。tabularray
手动的)。
更具体地说,对于您的情况,您需要替换\begin{tblr}{|l|}
为\begin{tblr}[expand=\mytikznode]{|l|}
:
\documentclass{beamer}
\mode<presentation>
\usepackage{tikz, tabularray}
\ExplSyntaxOn
\tl_new:N \tl_tmpa
\ExplSyntaxOff
\ExplSyntaxOn
\NewDocumentCommand{\mycontent} { m } {
\tl_clear:N \tl_tmpa
\tl_put_right:Nn \tl_tmpa {
\hline
#1
\hline
}
\let\mytikznode\tl_tmpa
}
\ExplSyntaxOff
\NewDocumentCommand{\myframe} {} {
\begin{frame}
\begin{tikzpicture}[remember picture,overlay]
\node at (current page.north)
[shift={(0,-4)}, anchor=north]{
\begin{tblr}[expand=\mytikznode]{|l|}
\mytikznode
\end{tblr}
};
\end{tikzpicture}
\end{frame}
}
\begin{document}
\mycontent{ a a a \\
b b b \\ }
\myframe
\end{document}
实际上,您可以简单地停留在 expl3 模式。没有必要\let\mytikznode\tl_tmpa
(您只需要注意 Ti 中的空格钾Z 选项)。另外,最好遵守 expl3 语法既定的命名约定:
\documentclass{beamer}
\mode<presentation>
\usepackage{tikz, tabularray}
\ExplSyntaxOn
\tl_new:N \l_userx_temp_tl
\NewDocumentCommand{\mycontent} { m } {
\tl_clear:N \l_userx_temp_tl
\tl_put_right:Nn \l_userx_temp_tl {
\hline
#1
\hline
}
}
\NewDocumentCommand{\myframe} {} {
\begin{frame}
\begin{tikzpicture}[remember~picture,overlay]
\node at (current~page.north)
[shift={(0,-4)}, anchor=north]{
\begin{tblr}[expand=\l_userx_temp_tl]{|l|}
\l_userx_temp_tl
\end{tblr}
};
\end{tikzpicture}
\end{frame}
}
\ExplSyntaxOff
\begin{document}
\mycontent{ a a a \\
b b b \\ }
\myframe
\end{document}