如何在环境中定义/使用局部变量LaTeX3 中的块

如何在环境中定义/使用局部变量LaTeX3 中的块

我正在尝试学习如何排版(将排版延迟到文档的后面),并且正在做一个重新创建的示例figure。它的用法如下:

\begin{myfigure}
  \mycaption{Foo}
\end{myfigure}

我只是想将\mycaption{Foo}它放入\caption文档中的适当位置。

完整的 MWE 在此处:

\documentclass[a4paper]{article}

\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\usepackage{xparse}
\usepackage{tikz}
\usepackage{xifthen}

\ExplSyntaxOn

\begin{document}

\NewDocumentEnvironment{myfigure}{mm} {
  \tl_new:N \l_myfigure_mycaption_tl

  \NewDocumentCommand{\mycaption}{m} {
    \tl_set:Nn \l_myfigure_mycaption_tl {#1}
  }

  \begin{figure}
    \begin{tikzpicture}
}{
    \end{tikzpicture}
    % a latex3 way of doing if-statement would be helpful to know.
    \ifthenelse{\isempty{\l_myfigure_mycaption_tl}}
      {}
      {\caption{\l_myfigure_mycaption_tl}}
  \end{figure}
}

\begin{myfigure}
  \mycaption{Foo}
\end{myfigure}

\end{document}

\mycaption在此,我尝试创建如下API :

\tl_new:N \l_myfigure_mycaption_tl

\NewDocumentCommand{\mycaption}{m} {
  \tl_set:Nn \l_myfigure_mycaption_tl {#1}
}

我正在尝试使该tl变量成为环境 myfigure。我试图使它不在环境之外全局创建,但我想在环境的“后块”中使用它。

然后我检查该变量是否为空,如果是不是空白,我排版了标题。

目标是能够:

  1. 定义一个 API 变量(例如\mycaption),用于在环境中设置值,并且
  2. 稍后将该值插入文档流中的适当位置。
  3. 不确定嵌套是否\NewDocumentCommand正确(根据该答案下的评论:如何在 LaTeX3 中定义嵌套环境和命令

这本质上是一种 getter/setter 方法,所以我想知道这是否是正确的方法,或者是否有更好的选择。如果有更好的选择,那就最好知道了,否则,仅仅知道如何使用我概述的方法来实现它也是有帮助的。

我的 MWE 中的标题显示为空白。

答案1

我建议使用一个可选的第三个参数来保存标题并进行测试\IfValueT{#3}{...}

\tl...在我看来,不需要代码......

也可能:key-value在这里应用一个界面来提供更多选项。

\documentclass[a4paper]{article}

\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\usepackage{xparse}
\usepackage{tikz}
\usepackage{xifthen}





\NewDocumentEnvironment{myfigure}{mmo} {%

  #1%
  \begin{figure}
    \begin{tikzpicture}
    }{%
    \end{tikzpicture}
    % a latex3 way of doing if-statement would be helpful to know.
    \IfValueT{#3}{%
      \caption{#3}%
    }%
  \end{figure}
}


\begin{document}


\begin{myfigure}{Stuff}{}[foo]
\end{myfigure}


\begin{myfigure}{Otherstuff}{}
\end{myfigure}


\end{document}

替代解决方案,通过在本地存储参数

\documentclass[a4paper]{article}

\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\usepackage{xparse}
\usepackage{tikz}
\usepackage{xifthen}

\ExplSyntaxOn

\tl_new:N \l_lance_mycaption_tl

\NewDocumentCommand{\mycaption}{+m}{%
  \tl_gset:Nn \l_lance_mycaption_tl {#1}
}

\NewDocumentEnvironment{myfigure}{mm} {%
  \tl_set_eq:NN \l_tmpa_tl \l_lance_mycaption_tl
  \begin{figure}
    \begin{tikzpicture}
    }{%
    \end{tikzpicture}
    \tl_if_empty:NF \l_lance_mycaption_tl {\caption{\tl_use:N \l_lance_mycaption_tl}}
  \end{figure}
  \tl_gset_eq:NN \l_lance_mycaption_tl  \l_tmpa_tl
}

\ExplSyntaxOff


\begin{document}


\begin{myfigure}{Stuff}{}
  \mycaption{Foo}
\end{myfigure}


\ExplSyntaxOn
Value\space of\space variable: \tl_use:N \l_lance_mycaption_tl
\ExplSyntaxOff

\begin{myfigure}{Otherstuff}{}
  \mycaption{Foobar}
\end{myfigure}


\end{document}

答案2

也许像这样

\documentclass[a4paper]{article}

\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{xparse}
\usepackage{tikz}


\ExplSyntaxOn

\NewDocumentCommand{\mycaption}{m} {
    \tl_gset:Nn \g_myfigure_mycaption_tl {#1}
}

\NewDocumentEnvironment{myfigure}{}{
    \tl_set:Nn \l_myfigure_mycaption_tl {}
  \begin{figure}
    \begin{tikzpicture}
}{
    \end{tikzpicture}
    \tl_if_empty:NTF\g_myfigure_mycaption_tl
      {}
      {\caption{\g_myfigure_mycaption_tl}}
  \end{figure}
}

\ExplSyntaxOff

\begin{document}

\begin{myfigure}
  \mycaption{Foo}
\end{myfigure}

\end{document}

答案3

您最终会处于环境\mycaption的中间tikzpicture

我不确定这样做并隐藏tikzpicture无法传递选项的内容有什么好处。

无论如何,最简单的方法是在开头指定标题。其他选项可以定义和设置。

\documentclass[a4paper]{article}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{expl3}
\usepackage{xparse}
\usepackage{tikz}

\ExplSyntaxOn

\keys_define:nn { pollard/figure }
 {
  caption      .tl_set:N = \l_myfigure_caption_tl,
  shortcaption .tl_set:N = \l_myfigure_caption_lof_tl,
  label        .tl_set:N = \l_myfigure_label_tl,
  align .choice:,
  align/left   .code:n = \raggedright,
  align/right  .code:n = \raggedleft,
  align/center .code:n = \centering,
 }

\NewDocumentEnvironment{myfigure}{O{}}
 {
  \begin{figure}[htp]
  \keys_set:nn { pollard/figure } { align=center, #1 }
  \begin{tikzpicture}
 }
 {
  \end{tikzpicture}
  \tl_if_empty:NF \l_myfigure_caption_tl
   {
    \tl_if_empty:NTF \l_myfigure_caption_lof_tl
     {
      \caption{\l_myfigure_caption_tl}
     }
     {
      \caption[\l_myfigure_caption_lof_tl]{\l_myfigure_caption_tl}
     }
    \tl_if_empty:NF \l_myfigure_label_tl { \label{\l_myfigure_label_tl} }
   }
  \end{figure}
}
\ExplSyntaxOff

\begin{document}

\listoffigures

\section{Examples}

\begin{myfigure}[
  caption=Foo,
]
\draw (0,0) -- (1,1);
\end{myfigure}

\begin{myfigure}[
  caption=Foo but with baz,
  shortcaption=Baz,
  label=foobaz,
  align=left,
]
\draw (0,0) -- (1,1);
\end{myfigure}

\end{document}

然而,我看不出

\begin{figure}[htp]
\centering

\begin{tikzpicture}
\draw (0,0) -- (1,1);
\end{tikzpicture}

\caption[Baz]{Foo but with baz}\label{foobaz}

\end{figure}

enter image description here

相关内容