有什么方法可以访问 a 的当前值吗KOMAoption
?在我的例子中,该选项是使用计算设置的。我稍后需要结果来确定在页面上放置某些内容的位置,并且执行两次计算似乎很愚蠢(尤其是因为相同的表达式在宏中不起作用,而我需要它)。
\documentclass[a4paper,oneside]{article}
\usepackage[margin=2cm,marginparwidth=4cm,includemp,reversemp]{geometry}
\usepackage{scrlayer-scrpage}
\KOMAoptions{headwidth=textwithmarginpar:-\dimexpr\marginparsep+\marginparwidth\relax,footwidth=textwithmarginpar:-\dimexpr\marginparsep+\marginparwidth\relax}
\begin{document}
DEBUG leftmargin=\the\leftmargin
DEBUG marginparwidth=\the\marginparwidth
DEBUG marginparsep=\the\marginparsep
DEBUG textwidth=\the\textwidth
DEBUG textwithmarginpar=??? % \the\textwithmarginpar gives Undefined control sequence.
DEBUG headwidth=??? % \the\headwidth gives Undefined control sequence.
\end{document}
同样的问题也出现在读取 \KOMAoption 的值以进行调试,但没有对实际问题的答案,只有有关调试问题的替代方法的建议。
同样的问题也出现在如何使用 KOMA 期权的当前值?,但给出的答案仅针对字体大小。
当然,我对我的问题的替代解决方案很感兴趣(找到headwidth
),但如果有一种通用的方法来访问的值,那么未来的访问者也会受益KOMAoption
。
答案1
首先请注意,该选项headwidth
不是单个值,而是具有三个值的选项,width:offset:offset
如手册第 5.5 节中所述。因此,询问选项的值也会显示这三个值。
KOMA-Script 提供了一个实验性的接口来询问选项的当前值。该接口目前未在手册中描述,仅在 KOMA-Script 主页中描述 →法律选择权的条款。因为这个描述只有德文,所以我要求 KOMA-Script 作者至少用scrkernel-basics.pdf
英文来描述它。
命令\KOMAoptionOf[<prefix command>]{<filename of package or class>}{<option>}
可用于询问选项的当前值。由于多个 KOMA-Script 选项提供多个值,因此结果不仅可以是一个值,还可以是一个逗号分隔的值列表。该命令不可扩展,因此要将值用作另一个命令的参数,请<prefix command>
使用。即使要打印值也可能需要这样做。但是,这仅显示选项本身的值,因此:
\documentclass{scrartcl}
\usepackage{scrlayer-scrpage}
\KOMAoptions{headwidth=textwithmarginpar:-\dimexpr\marginparsep+\marginparwidth\relax,footwidth=head}
\usepackage{url}
\begin{document}
DEBUG headwidth=\KOMAoptionOf[\url]{scrlayer-scrpage.sty}{headwidth}
\end{document}
只会导致:
这绝对正确,并且确实是 option 的当前值headwidth
。但是,它不是页头的长度。因此,您不能将其用作其他长度的值。
另外,您对 的使用\leftmargin
也是错误的。\leftmargin
是用于列表的 LaTeX 长度。 奇数页(或单面文档的所有页面)的当前左边距为\dimexpr \oddsidemargin+1in\relax
。 偶数页的当前左边距为\dimexpr \evensidemargin+1in\relax
。
甚至textwithmarginpar
不是一个选项,也远非真正的长度。对于选项来说,它是一个符号值,只不过是一个具有特殊语义的字符串。但是,您可以轻松地自己计算它。要显示该值,您可以使用\the
,甚至无需使用 KOMA-Script:
\documentclass{article}
\begin{document}
DEBUG textwithmarginpar=\the\dimexpr\textwidth+\marginparwidth+\marginparsep\relax
\end{document}
所以你的整个问题都是基于错误的假设。
然而,页眉的当前宽度确实是内部的 的值scrlayer-scrpage
。使用内部值始终是一种 hack,并且每当内部发生更改时都可能中断:
\documentclass{scrartcl}
\usepackage{scrlayer-scrpage}
\KOMAoptions{headwidth=textwithmarginpar:-\dimexpr\marginparsep+\marginparwidth\relax,footwidth=head}
\usepackage{url}
\begin{document}
DEBUG headwidth=\csname sls@headwidth\endcsname% WARNING: USING AN INTERNAL MACRO COULD BREAK!!!
\end{document}
目前会导致
一个不使用内部构件的建议是自己计算:
\documentclass{scrartcl}
\usepackage{scrlayer-scrpage}
\newlength{\myheadwidth}
\setlength{\myheadwidth}{\dimexpr\textwidth+\marginparsep+\marginparwidth\relax}
\KOMAoptions{headwidth=\myheadwidth:-\dimexpr\marginparsep+\marginparwidth\relax,footwidth=head}
\usepackage{url}
\begin{document}
DEBUG headwidth=\the\myheadwidth
\end{document}
结果和以前一样。