LaTeX2e 解决方案

LaTeX2e 解决方案

这是关于计算和保存LaTeX3dim 以在加载包时作为参数传递。如果重要的话,我会使用

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

我有两个问题:

  1. 无法根据geometry包裹 计算出正确的长度
    • 从外边缘marginpar到纸张外边缘的长度
  2. 无法将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 类别代码制度进行标记。

相关内容