从宏中设置 \geometry 键的值

从宏中设置 \geometry 键的值

我正在尝试geometry通过宏来设置包的参数。例如

\def\xxx{false}
\geometry{twoside=\xxx}

但是上述命令似乎\expandafter\geometry{twoside=\xxx}不起作用;我也\expandafter\geometry\expandafter{twoside=\xxx}按照建议尝试了使用宏传递到 \geometry{} 选项 - keyval 错误。有没有什么办法可以实现这个功能?(最好是一种解释性的方法)

答案1

您的 序列\expandafter仅达到t

可能有更好的方法,但如果没有关于文档类别及其\xxx设置位置的更多详细信息,这种方法是可行的

\def\xxx{false} % or true

\expandafter\geometry\expanded{twoside=\xxx}

如果你不相信你的用户有最新的支持 TeX 发行版\expanded,你可以这样做

\def\xxx{false} % or true

\begingroup\edef\x{\endgroup\noexpand\geometry{twoside=\xxx}}\x

更通用的方法可能是

\newcommand{\js@set@geometry@option}[2]{%
  \expandafter\js@set@geometry@option@aux\expandafter{#2}{#1}%
}
\newcommand\js@set@geometry@option@aux[2]{\geometry{#2=#1}}

所以你可以打电话

\js@set@geometry@option{twoside}{\xxx}

并且可以使用任何其他选项。


对于expl3键,您可以定义一个选择键:

\documentclass{book}
\usepackage{xparse,geometry,lipsum}

\ExplSyntaxOn

\NewDocumentCommand{\selectoptions}{m}
 {
  \keys_set:nn { jason/class } { #1 }
 }

\keys_define:nn { jason/class }
 {
  twoside .choices:nn = { true, false } { \geometry{twoside=#1} },
  twoside .default:n = true,
 }

\ExplSyntaxOff

\selectoptions{twoside}

\begin{document}

\chapter{Test chapter}

\section{Test section}

\lipsum[1-20]

\end{document}

答案2

在 中\geometry{twoside=\xxx},你需要\xxx先扩展,然后\geometry。在 中\expandafter\geometry\expandafter{twoside=\xxx}t先扩展,然后\geometry

这里有一个解决方案,使用宏来收集键值列表,然后将其传递给\geometry{...}

\usepackage{etoolbox}

\makeatletter
\def\geo@options{}

\appto\geo@options{twoside=}
% now \geo@options == "twoside="

\def\xxx{false}
\expandafter\appto\expandafter\geo@options{\xxx}
% now \geo@options == "twoside=false"

\expandafter\geometry\expandafter{\geo@options}
\makeatother

相关内容