有了LaTeX2e
,包marginratio
提供的密钥geometry
就可以安全地使用:
\documentclass{book}
\usepackage{geometry}
\usepackage{calc}
\newlength{\mylayoutwidth}
\newlength{\mylayoutheight}
\setlength{\mylayoutwidth}{170mm}
\setlength{\mylayoutheight}{240mm}
\geometry{%
layoutsize={\mylayoutwidth,\mylayoutheight}
,textwidth=\mylayoutwidth*3/4
,textheight=\mylayoutheight*3/4
,marginratio={4:6,5:7}
}
\begin{document}
Foo.
\end{document}
但同一种代码的表达方式是LaTeX3
:
\documentclass{book}
\usepackage{expl3}
\usepackage{geometry}
\usepackage{calc}
\ExplSyntaxOn
\dim_const:Nn \c_my_layoutwidth_dim { 170mm}
\dim_const:Nn \c_my_layoutheight_dim { 240mm}
\geometry{
layoutsize={\c_my_layoutwidth_dim,\c_my_layoutheight_dim}
,textwidth=\c_my_layoutwidth_dim*3/4
,textheight=\c_my_layoutwidth_dim*3/4
,marginratio={4:6,5:7}
}
\ExplSyntaxOff
\begin{document}
Foo.
\end{document}
失败并出现错误:
Runaway argument?
4:6\relax \ifnum \@tempcntb >\z@ \else \Gm@warning {margin ratio a:b \ETC.
! File ended while scanning use of \Gm@sep@ratio.
<inserted text>
\par
<*> test.tex^^M
?
我猜这是来自冒号 catcode,LaTeX3
但是是否也可以marginratio
与 LaTeX3 一起使用?
答案1
:
在 内有 catcode 11。您\ExplSyntax...
必须:
在 marginratio 中生成 catcode 12 的,方法是将其替换:
为\char_generate:nn { `\: } { 12 }
。或者,您可以定义一个宏来扩展为 catcode 12 的冒号。不过,最好的解决方案是使用预定义常量,\c_colon_str
即 catcode 12 的冒号。TeX 的“特殊”符号还有更多常量,例如百分号、与号或脱字符,它们都是 catcode 12。LaTeX3 接口第十二部分第 6 节文档有一个列表。
编辑: 从 Jean-Francois 开始回答我纠正了宽度/高度混淆。
\documentclass{book}
\usepackage{expl3}
\usepackage{geometry}
\usepackage{calc}
\ExplSyntaxOn
\dim_const:Nn \c_my_layoutwidth_dim { 170mm}
\dim_const:Nn \c_my_layoutheight_dim { 240mm}
\geometry{
layoutsize={\c_my_layoutwidth_dim,\c_my_layoutheight_dim}
,textwidth=\c_my_layoutwidth_dim*3/4
,textheight=\c_my_layoutheight_dim*3/4
,marginratio={4 \c_colon_str 6, 5 \c_colon_str 7}
}
\ExplSyntaxOff
\begin{document}
Foo.
\end{document}
答案2
您也可以简单地在冒号前面加上前缀\string
(但请注意空格……)。
请注意,您的 OP 在 LaTeX3 部分有一个拼写错误,将宽度写成了高度...因此请跳到这个答案的底部进行修复,并跳过中间令人困惑的讨论,我在这里留下了如何浪费时间的证词。
忽略这个!
但似乎有些问题(@HenriMenke 的代码也是如此回答:如果我添加包,layout
使用\geometry
with\ExplSyntaxOn/\ExplSyntaxOff
会生成 6 页而不是 3 页。
问题也出在layout
未使用的包上,只需检查日志中的几何参数,特别\topmargin
是\textheight
我不知道原因(*)但页面参数确实不同:
(*)这可能是由于
\mylayoutwidth=\skip52
\mylayoutheight=\skip53
相对
\c_my_layoutwidth_dim=\dimen144
\c_my_layoutheight_dim=\dimen145
即使用\dimen
而不是\skip
(=LaTeX 的长度)?。我不了解 LaTeX3,因此不知道应该怎么做才能\skip
在那里使用,并检查这确实是问题所在
(更新:或者根本没有:显然仅用“ dim
”替换“ skip
”是语法,但它不会对观察到的问题产生任何改变)。
没有 LaTeX3 语法:
使用 LaTeX3 语法(此处使用\string
或来自@HenriMenke 的语法)回答):
可以看出\topmargin
和存在差异\textheight
。
\documentclass{book}
\usepackage{expl3}
\usepackage{geometry}
\usepackage{calc}
\usepackage{layout}
\ExplSyntaxOn
\dim_const:Nn \c_my_layoutwidth_dim { 170mm}
\dim_const:Nn \c_my_layoutheight_dim { 240mm}
\geometry{
layoutsize={\c_my_layoutwidth_dim,\c_my_layoutheight_dim}
,textwidth=\c_my_layoutwidth_dim*3/4
,textheight=\c_my_layoutwidth_dim*3/4
,marginratio={4\string :6,5\string :7}
}
\ExplSyntaxOff
\begin{document}
\layout % gives different results if \geometry used with l3 syntax or not ...
Foo.
\end{document}
包含 OP 拼写错误的代码已修复...
\documentclass{book}
\usepackage{expl3}
\usepackage{geometry}
\usepackage{calc}
\ExplSyntaxOn
\dim_const:Nn \c_my_layoutwidth_dim { 170mm}
\dim_const:Nn \c_my_layoutheight_dim { 240mm}
\geometry{
layoutsize={\c_my_layoutwidth_dim,\c_my_layoutheight_dim}
,textwidth=\c_my_layoutwidth_dim*3/4
,textheight=\c_my_layoutheight_dim*3/4
,marginratio={4\string :6,5\string :7}
}
\ExplSyntaxOff
\begin{document}
Foo.
\end{document}
那么就没问题了。