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}.