如何使几何包中的 marginratio 也与 LaTeX3 一起工作?

如何使几何包中的 marginratio 也与 LaTeX3 一起工作?

有了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使用\geometrywith\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 的语法)回答):

使用 \geometry 的 l3 语法的页面布局

可以看出\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}

那么就没问题了。

相关内容