这是关于计算和保存LaTeX3
dim 以在加载包时作为参数传递。如果重要的话,我会使用
This is LuaHBTeX, Version 1.15.0 (MiKTeX 22.3)
LaTeX2e <2022-06-01> patch level 3
geometry 2020/01/02 v5.9 Page Geometry
我有两个问题:
- 无法根据
geometry
包裹 计算出正确的长度- 从外边缘
marginpar
到纸张外边缘的长度
- 从外边缘
- 无法将
LaTeX3
长度以正确的形式作为包的参数- (
Undefined control sequence <argument> width={\use_dim:N \l__calculated_width_dim}
)
- (
\usepackage[width={\dim_use:N \l__calculated_width_dim}]{aPackage}
MWE(损坏)
\documentclass[a4paper,11pt]{article}
\usepackage{geometry}
\geometry{
top=25mm,
bottom=25mm,
inner=25mm,
textwidth=100mm,
marginparsep=10mm,
marginparwidth=40mm
}
\ExplSyntaxOn
\makeatletter
% \dim_show:n { \Gm@layoutwidth }
% \dim_show:n { \Gm@layouthoffset }
\dim_new:N \l__calculated_width_dim
\dim_set:Nn \l__calculated_width_dim
{
\pagewidth - \Gm@layoutwidth - \Gm@layouthoffset
}
% \dim_show:n { \l__calculated_width_dim }
\makeatother
\usepackage[width={\use_dim:N \l__calculated_width_dim}]{aPackage}
\ExplSyntaxOff
\begin{document}
Text.
\end{document}
我知道可能可以作为命令的一部分动态计算长度\usepackage
。我认为保存长度以供重复使用很有用。
我想要从纸张外边缘marginpar
到纸张外边缘的长度。看着geometry
包文档第7页看起来计算应该是\pagewidth - \layoutwidth - \layouthoffset
。
\dim_show:n { \pagewidth }
以 pt 为单位显示纸张的正确宽度。
\dim_show:n { \layoutwidth }
导致缺失数字错误。
深入挖掘后,geometry
我尝试
\makeatletter
\dim_show:n { \Gm@layoutwidth }
\dim_show:n { \Gm@layouthoffset }
\makeatother
它可以工作,但\Gm@layoutwidth
给出的尺寸\pagewidth
与\Gm@layouthoffset
。
geometry
我尝试在加载时将页面尺寸作为参数传递
\documentclass[a4paper,11pt]{article}
\usepackage[
top=25mm,
bottom=25mm,
inner=25mm,
textwidth=100mm,
marginparsep=10mm,
marginparwidth=40mm
]{geometry}
\ExplSyntaxOn
\makeatletter
\dim_show:n { \Gm@layoutwidth }
\dim_show:n { \Gm@layouthoffset }
\makeatother
\ExplSyntaxOff
\begin{document}
Text.
\end{document}
我尝试不带参数并调用\geometry
\documentclass[a4paper,11pt]{article}
\usepackage[]{geometry}
\geometry{
top=25mm,
bottom=25mm,
inner=25mm,
textwidth=100mm,
marginparsep=10mm,
marginparwidth=40mm
}
\ExplSyntaxOn
\makeatletter
\dim_show:n { \Gm@layoutwidth }
\dim_show:n { \Gm@layouthoffset }
\makeatother
\ExplSyntaxOff
\begin{document}
Text.
\end{document}
两者具有相同的效果。\Gm@layoutwidth
始终与 相同,\paperwidth
并且\Gm@layouthoffset
始终为 0.0pt。
答案1
据我了解,“layout”参数geometry
用于方便打印,例如在 A4 纸上打印 A5 布局。鉴于geometry
手册中说:
默认情况下“布局尺寸默认与纸张大小一致”
这可以解释为什么你发现
\Gm@layoutwidth
始终与 相同\paperwidth
且\Gm@layouthoffset
始终为 0.0pt。
因此,我认为最好坚持使用 LaTeX 标准长度进行页面布局,由 John Kormylo 提议。
LaTeX2e 解决方案
使用 John 的想法,这是 LaTeX2e 风格的第一个解决方案。它使用\oddsidemargin
,因此是先验仅适用于奇数页 — 当然,除非偶数页具有相同的布局。showframe
我们在此处传递的选项geometry
显示了各种页面元素的限制,尤其是边距。
\documentclass{article}
\usepackage{xcolor}
\usepackage[showframe]{geometry}
\geometry{
top=25mm,
bottom=25mm,
inner=25mm,
textwidth=100mm,
marginparsep=10mm,
marginparwidth=40mm,
}
\newlength{\remainingWidth}
\setlength{\remainingWidth}{%
\dimexpr \paperwidth - 1in -\oddsidemargin - \textwidth -
\marginparsep - \marginparwidth \relax % or \dimeval{...} (recent)
}
% Actually, \usepackage[width=\remainingWidth]{thumbs} also works, presumably
% because what is really expected after 'width=' is a ⟨dimen⟩. That is why I wrote
% in the comments that a very precise specificiation of the interface of the
% external package is important.
\begingroup
\edef\tmp{\endgroup
\noexpand\usepackage[width=\the\remainingWidth]{thumbs}%
}\tmp
\usepackage{lipsum}
\begin{document}
\addthumb{A title}{1}{white}{blue!70}%
\lipsum[1][1-4]
\end{document}
expl3
的解决方案
由于您明确要求这样做,这里有一种expl3
计算长度并将传递width=value
给您选择的包的方法。话虽如此,我认为这不会给我们带来太多帮助。
我负责执行\usepackage
之后的调用,\ExplSyntaxOff
因为它会读取外部文件,而且我不确定如果在\ExplSyntaxOn
制度下调用,它是否会按照标准 LaTeX2e 中的预期重置类别代码。
\documentclass{article}
\usepackage{xcolor}
\usepackage[showframe]{geometry}
\geometry{
top=25mm,
bottom=25mm,
inner=25mm,
textwidth=100mm,
marginparsep=10mm,
marginparwidth=40mm,
}
\ExplSyntaxOn
\dim_new:N \l_octal_remaining_width_dim
\dim_set:Nn \l_octal_remaining_width_dim
{
\paperwidth - 1in - \oddsidemargin - \textwidth -
\marginparsep - \marginparwidth
}
\cs_new_protected:Npn \octal_pass_kv_opt_to_pkg:nnn #1#2#3
{
\PassOptionsToPackage { #1 = #2 } {#3}
}
\cs_generate_variant:Nn \octal_pass_kv_opt_to_pkg:nnn { nV }
\octal_pass_kv_opt_to_pkg:nVn { width } \l_octal_remaining_width_dim { thumbs }
\ExplSyntaxOff
\usepackage{thumbs}
\usepackage{lipsum}
\begin{document}
\addthumb{A title}{1}{white}{blue!70}%
\lipsum[1][1-4]
\end{document}
与上面相同的输出。
请注意,width=
和包名称thumbs
具有相同的类别代码,无论它们是在之前还是之后输入\ExplSyntaxOn
,因此,我们使用的\octal_pass_kv_opt_to_pkg:nVn
保证是将选项传递给具有thumbs
相同类别代码的,就像在标准类别代码制度下\usepackage
或\PassOptionsToPackage
在标准类别代码制度下完成的一样。
V
变体\octal_pass_kv_opt_to_pkg:nVn
传递价值变量作为第二个参数传递给基本形式。这相当于在第一个方法中传递扩展的结果dim
(我们使用)。\l_octal_remaining_width_dim
\octal_pass_kv_opt_to_pkg:nnn
\the\remainingWidth
\edef
_
对于其他用途,如果存在类别代码不适当(选项名称包含、:
或...)的风险~
,您只需创建一个包装器或别名,执行类似于\octal_pass_kv_opt_to_pkg:nVn { width } \l_octal_remaining_width_dim { thumbs }
并调用它后 \ExplSyntaxOff
。例如,使用 的相同定义\octal_pass_kv_opt_to_pkg:nnn
,您可以执行以下操作:
\cs_generate_variant:Nn \octal_pass_kv_opt_to_pkg:nnn { nv }
\cs_new_eq:NN \myPassKvOptToPkg \octal_pass_kv_opt_to_pkg:nvn
\ExplSyntaxOff
\myPassKvOptToPkg{width}{l_octal_remaining_width_dim}{thumbs}
\usepackage{thumbs}
在这种情况下,选项名称width
以及包名称thumbs
将根据标准 LaTeX 类别代码制度进行标记。