![从宏中设置 \geometry 键的值](https://linux22.com/image/415843/%E4%BB%8E%E5%AE%8F%E4%B8%AD%E8%AE%BE%E7%BD%AE%20%5Cgeometry%20%E9%94%AE%E7%9A%84%E5%80%BC.png)
我正在尝试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