我想要的基本想法是创建一个键来传递一个值,该值将告知\makebox
框中的内容应如何对齐。这里失败了。
预期的内容\makebox
并未作为参数传递,\makebox
并且我似乎忽略了或将密钥的随机组件插入到文本中。
这里发生了什么事?
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_aefl_position_tl
\tl_set:Nn \l_aefl_position_tl { [l] }
\keys_define:nn { aefl }
{
pos .code:n = {
\str_case:nnn { #1 }
{
{ left } { \tl_set:Nn \l_aefl_position_tl {[l]} }
{ center } { \tl_set:Nn \l_aefl_position_tl {} }
}
{
{ right } { \tl_set:Nn \l_aefl_position_tl {[r]} }
}
},
}
\NewDocumentCommand{\aecurrfile}{ o }
{
\group_begin:
\IfNoValueF{#1}{\keys_set:nn { aefl }{#1}}
\makebox[0pt] \l_aefl_position_tl
{ contents ~ of ~ my ~ box }
\group_end:
}
\ExplSyntaxOff
\pagestyle{empty}
\begin{document}
\begin{tabular}{lcl}
unexpected & \verb=[l]= & \aecurrfile \\
unexpected & \verb=[l]= & Front \aecurrfile[pos=left] Back \\
& & Front \aecurrfile[pos=center] Back \\
unexpected & \verb=right[l]= & Front \aecurrfile[pos=right] Back
\end{tabular}
\end{document}
编辑
最后,我明白为什么我会得到意外就在我的输出中。啊!
答案1
你的问题是,当 LaTeX 寻找可选参数时,它需要找到一个文字 [
并且没有存储在任何东西中。所以你需要在查找\l_aefl_position_tl
之前展开\makebox
。我可能会选择类似
\use:x { \exp_not:N \makebox [0pt] \l_aefl_position_tl }
正如您所知,的内容\l_aefl_position_tl
是“安全”的。
答案2
我会简化业务。;-)
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_aefl_position_tl
\tl_set:Nn \l_aefl_position_tl { \makebox[0pt][l] }
\keys_define:nn { aefl }
{
pos .choice:,
pos / left .code:n = \tl_set:Nn \l_aefl_position_tl { \makebox[0pt][l] },
pos / right .code:n = \tl_set:Nn \l_aefl_position_tl { \makebox[0pt][r] },
pos / center .code:n = \tl_set:Nn \l_aefl_position_tl { \makebox[0pt] },
}
\NewDocumentCommand{\aecurrfile}{ O{} }
{
\group_begin:
\keys_set:nn { aefl } { #1 }
\tl_use:N \l_aefl_position_tl { contents ~ of ~ my ~ box }
\group_end:
}
\ExplSyntaxOff
\pagestyle{empty}
\begin{document}
\begin{center}
\parbox{10cm}{
Default:\\
\aecurrfile
Left:\\
\aecurrfile[pos=left]
Center:\\
\aecurrfile[pos=center]
Right:\\
\aecurrfile[pos=right]
}
\end{center}
\end{document}