我正在尝试学习如何排版(将排版延迟到文档的后面),并且正在做一个重新创建的示例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
。我试图使它不在环境之外全局创建,但我想在环境的“后块”中使用它。
然后我检查该变量是否为空,如果是不是空白,我排版了标题。
目标是能够:
- 定义一个 API 变量(例如
\mycaption
),用于在环境中设置值,并且 - 稍后将该值插入文档流中的适当位置。
- 不确定嵌套是否
\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}