最小工作示例

最小工作示例

expl3又一次打败了我,所以我又要依赖陌生人的善意。

我认为根本问题更多在于分割输入而不是文件读取。

语境: 我想将参数加载到geometry包裹\geometry{}使用 从文件中执行 命令。expl3我尝试了至少 4 种读取文件的方法。但无论我如何加载文件,整个内容都会\geometry{}作为单个标记/字符串/块/事物传递,因为geometry包抱怨整个事物top=2cm,bottom=2cm不是有效的密钥Package keyval Error: top=2cm,bottom=2cm undefined.,但如果我将其放入\geometry{top=2cm,bottom=2cm}文档中,则会正确处理。

我见过这个答案它会拆分键值对,但我需要输入流中一次获取所有的键值对,而不是一次获取一个。

最小工作示例

这有效:

\documentclass{article}

\ExplSyntaxOn % Also works without expl3 syntax
\usepackage{geometry}
\geometry{top=2cm,bottom=2cm}
\ExplSyntaxOff

\begin{document}
Document content.
\end{document}

最少不起作用的示例

expl3(为了简洁,不使用推荐的命名约定)

代币列表

令牌列表失败导致Package keyval Error: top=2cm,bottom=2cm undefined.

\documentclass{article}

\ExplSyntaxOn
\tl_clear_new:N \geotoks_tl
\tl_set:Nn \geotoks_tl {top=2cm,bottom=2cm}
% Also fails with {top=2cm, bottom=2cm}

\usepackage{geometry}
\geometry{\geotoks_tl} % fail
% \geometry{\tl_use:N \geotoks_tl}  % fail
\ExplSyntaxOff

\begin{document}
Document content.
\end{document}

细绳

字符串失败导致Package keyval Error: top=2cm,bottom=2cm undefined.

\documentclass{article}

\ExplSyntaxOn

\str_clear_new:N \geotoks_str
\str_set:Nn \geotoks_str {top=2cm,bottom=2cm}
% Also fails with {top=2cm, bottom=2cm}

\usepackage{geometry}
\geometry{\geotoks_str} % fail
% \geometry{\str_use:N \geotoks_str} % fail
\ExplSyntaxOff

\begin{document}
Document content.
\end{document}

克里斯特

Clist 失败导致Package keyval Error: top=2cm,bottom=2cm undefined.

\documentclass{article}

\usepackage{geometry}
\ExplSyntaxOn
\clist_clear_new:N \geotoks_clist
\clist_set:Nn \geotoks_clist {top=2cm, bottom=2cm}

\usepackage{geometry}
\geometry{\clist_use:Nn \geotoks_clist {,}}
% Also fails with
% \geometry{\clist_use:Nn \geotoks_clist {~}}
% though error message is `Package keyval Error: top=2cm bottom=2cm undefined.`
\ExplSyntaxOff

\begin{document}
Document content.
\end{document}

序列

\documentclass{article}

\usepackage{geometry}
\ExplSyntaxOn
\clist_clear_new:N \geotoks_clist
\clist_set:Nn \geotoks_clist {top=2cm, bottom=2cm}
\seq_clear_new:N \geotoks_seq
\seq_set_from_clist:NN \geotoks_seq \geotoks_clist

\usepackage{geometry}
\geometry{\seq_use:Nn \geotoks_seq {,}}
% Also fails with {~} as the separator
\ExplSyntaxOff

\begin{document}
Document content.
\end{document}

我也遇到了同样的失败,拆分成一个序列描述在这里

文件加载

Package keyval Error: top=2cm,bottom=2cm undefined.我在使用这些答案中的文件加载方法时也遇到了同样的失败:

无奈之下我也尝试了\geometry{\file_input:n {geometryParams.txt}},但至少给了我一个不同的错误,与ExplSyntax 内部或外部的Missing \endcsname inserted.错误相同。\geometry{\input{params.txt}}

答案1

\geometry不扩展它的参数,它需要一个键列表作为参数,而不是隐藏在某些命令中的键列表。所以无论你做什么里面该参数将起作用。假设您的键列表在一个简单的命令中,\mykeylist您可以从外部扩展它。要么使用旧的

\expandafter\geometry\expandafter{\mykeylist}

或使用新的 LaTeX 命令\ExpandArgs

\ExpandArgs{o}\geometry{\mykeylist}

无关,但您没有遵循 expl3 命名方案。变量应以前缀开头,显示它们是全局变量还是局部变量,后跟模块名称,然后是显示其用途的内容。

所以

\geotoks_str  -> \l_geotoks_keys_str

答案2

从问题的标题来看,我猜您想从文件中加载选项。

\begin{filecontents*}{\jobname.geo}
top=2cm,
bottom=2cm
left=2cm,a4paper
\end{filecontents*}

\documentclass{article}
\usepackage[showframe]{geometry}

\ExplSyntaxOn
\NewDocumentCommand{\geometryfromfile}{m}
 {
  \dococtal_geometry_fromfile:n { #1 }
 }

\ior_new:N \g_dococtal_geometry_file_ior
\clist_new:N \g_dococtal_geometry_options_clist

\cs_new_protected:Nn \dococtal_geometry_fromfile:n
 {
  \ior_open:Nn \g_dococtal_geometry_file_ior { #1 }
  \clist_gclear:N \g_dococtal_geometry_options_clist
  \ior_map_inline:Nn \g_dococtal_geometry_file_ior
   {
    \clist_gput_right:Nn \g_dococtal_geometry_options_clist { ##1 }
   }
  \exp_args:NV \geometry \g_dococtal_geometry_options_clist
 }

\ExplSyntaxOff

\geometryfromfile{\jobname.geo}

\begin{document}

Test

\end{document}

您会发现文件输入得相当懒散,但上面的命令运行起来没有问题,因为我们逐行读取文件并\clist_gput_right:Nn完成其余操作。事实上,clist 的内容是

The comma list \g_dococtal_geometry_options_clist contains the items (without
outer braces):
>  {top=2cm}
>  {bottom=2cm}
>  {left=2cm}
>  {a4paper}.

相关内容