
ifcommand
from keycommand
package in 과 같은 구문이 있습니까 pgfkeys
? 나는 다음과 같은 것을하고 싶다
\pgfkeys{
/Table/.is family,
/Table,
caption/.ecode = ???
}
\newenvironment{Table}[1][]{
\pgfkeys{/Table, #1}
\begin{table}
\TableCaption % expand to \caption{/Table/caption} if /Table/caption is set
% expand to nothing otherwise
}{
\end{table}
}
답변1
여기서는 내부적으로 /Table/@caption
캡션 삽입 방법을 정의하는 데 사용합니다. 처음에는 코드가 비어 있습니다. 스타일 /Table/caption
은 로 재정의됩니다 \caption{#1}
.
\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys{/Table/.is family,/Table}
\def\Tablekeys#1{\pgfkeys{/Table,#1}}
\Tablekeys{
@caption/.code={},
caption/.style={@caption/.code={\caption{#1}}},
}
\newenvironment{Table}[1][]{
\Tablekeys{#1}
\begin{table}[h]
\Tablekeys{@caption}
\centering
}{%
\end{table}
}
\begin{document}
\begin{Table}
\fbox{Content of table 1}
\end{Table}
\begin{Table}[caption=Table 2]
\fbox{Content of table 2}
\end{Table}
\end{document}
첫 번째 변형
핸들러를 사용하면 초기화 없이 .try
사용할 수 있습니다 /Table/@caption
.
\pgfkeys{/Table/.is family,/Table}
\def\Tablekeys#1{\pgfkeys{/Table,#1}}
\Tablekeys{
caption/.style={@caption/.code={\caption{#1}}}
}
\newenvironment{Table}[1][]{
\Tablekeys{#1}
\begin{table}[h]
\Tablekeys{@caption/.try}
\centering
}{%
\end{table}
}
두 번째 변형
\TableCaption
핸들러 를 통해 캡션을 저장 .store in
하고 패키지 \ifdefempty
에서 사용할 수 있습니다 etoolbox
.
\usepackage{etoolbox}
\pgfkeys{/Table/.is family,/Table}
\def\Tablekeys#1{\pgfkeys{/Table,#1}}
\Tablekeys{
caption/.store in=\TableCaption,
% default caption is empty
caption=,
}
\newenvironment{Table}[1][]{
\Tablekeys{#1}
\begin{table}[h]
\ifdefempty{\TableCaption}{}{\caption{\TableCaption}}
\centering
}{%
\end{table}
}
답변2
아마도 이것은 pgfkeys
. 다음은 키를 사용한 전체 구현입니다 expl3
.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\keys_define:nn { constructor/table }
{
caption .tl_set:N = \l_constructor_table_caption_tl,
short .tl_set:N = \l_constructor_table_shortcaption_tl,
label .tl_set:N = \l_constructor_table_label_tl,
alignment .tl_set:N = \l_constructor_table_alignment_tl,
alignment .initial:n = \centering,
specifier .tl_set:N = \l_constructor_table_specifier_tl,
specifier .initial:n = htp,
}
\NewDocumentEnvironment{Table}{O{}}
{
\keys_set:nn { constructor/table } { #1 }
\use:x { \exp_not:N \begin{table}[\l_constructor_table_specifier_tl] }
\tl_if_empty:NF \l_constructor_table_caption_tl
{
\tl_if_empty:NTF \l_constructor_table_shortcaption_tl
{
\caption
{
\l_constructor_table_caption_tl
}
}
{
\caption
[
\l_constructor_table_shortcaption_tl
]
{
\l_constructor_table_caption_tl
}
}
}
\tl_if_empty:NF \l_constructor_table_label_tl
{
\label{\l_constructor_table_label_tl}
}
\l_constructor_table_alignment_tl
}
{\end{table}}
\ExplSyntaxOff
\begin{document}
\listoftables
\begin{Table}[
specifier=tp,
]
\fbox{Content of noncaptioned table}
\end{Table}
\begin{Table}[
caption=caption text,
short=short,
label=foo,
alignment=\raggedright,
]
\fbox{A table with a caption}
\end{Table}
With a reference to table~\ref{foo}.
\end{document}
캡션이 없는 테이블에는 이 있으므로 tp
맨 위에 표시됩니다. 테이블 목록에서 캡션은 짧은 것입니다.
그런데 생각보다 큰 장점은 없는 것 같아요
\begin{table}[tp]
\fbox{Content of noncaptioned table}
\end{table}
\begin{table}
\caption[short]{caption text}\label{foo}
\raggedright
\fbox{A table with a caption}
\end{table}