expl3 和 tikzpicture

expl3 和 tikzpicture

我想将一些文本保存在一个全局变量中,我将其用作 的内容tabular。我使用expl3tikz来放置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}

相关内容