Условно выполнить макрос в зависимости от используемого шрифта
Я большой поклонник амперсандов - настолько, что прислушался к совету SimpleBits "использовать самый лучший из доступных амперсандов" довольно религиозно.
Для этого я определил следующий ярлык в LaTeX:
\let\amp\&
\renewcommand\&{{\scalebox{1.2}{\textnormal{\fontspec{Baskerville}\itshape\amp}}}}
Вкратце, это меняет все виды использования "нормального" амперсанда на стильный вариант, например:
This is a text \& it contains an ampersand.
(С помощью \&
вместо просто &
поскольку так работает LaTeX - последний уже зарезервирован для отдельных столбцов в табличных средах.)
Тем не менее, здесь всегда используется один и тот же шрифт - здесь, Baskerville - независимо от того, подходит он или нет. Я хотел бы использовать другой шрифт в зависимости от используемого семейства шрифтов. То есть я хочу использовать другой амперсанд в сочетании с текстом без засечек, и, в частности, я хочу предотвратить перезапись амперсанда в монокосмическом контексте. Поэтому в следующих двух контекстах я не хочу запускать приведенное выше определение:
{\sffamily a \& b}
{\ttfamily a \& b}
Как я могу это сделать?
Я представляю что-то вроде следующего:
\renewcommand\&{
\ifsans
{\fontspec{Trebuchet MS}{\textnormal{\itshape\amp}}}
\else
\ifmono
\amp
\else
{\fontspec{Baskerville}\scalebox{1.2}{\textnormal{\itshape\amp}}}
\fi
\fi}
2 ответа
Работает следующим образом:
\documentclass[letterpaper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage{german}
\usepackage{geometry}
\geometry{margin=2cm}
\newcommand*\origsffamily{}
\let\origsffamily\sffamily
\renewcommand*\sffamily{\origsffamily\small {\renewcommand\&{{\scalebox{1.2}{\textnormal{\fontspec{Baskerville}\itshape\amp}}}}}}
\begin{document}
hello, this is \& a \sffamily test \&
\end{document}
Это означает, что вы включаете изменение знака амперсанда в определение (в моем примере) \sffamily
,
Недостатком является, конечно, то, что вы должны делать это для всех желаемых семейств шрифтов.
Вы можете проверить стандартный список токенов LaTeX \f@family
Однако это может быть не так надежно, как вы хотите. Следующий код просто проверяет, равно ли текущее семейство семействам по умолчанию, установленным \setmainfont
а также \setsansfont
, но не являются ли шрифты действительно без засечек:
\documentclass{article}
\usepackage{fontspec}
\usepackage{expl3}
\usepackage{xparse}
\setmainfont{DejaVu Serif}
\setsansfont{DejaVu Sans}
\makeatletter
\ExplSyntaxOn
\NewDocumentCommand \amp { } {
\tl_if_eq:NNTF \f@family \rmdefault {
% this is a roman font
A
} {
\tl_if_eq:NNTF \f@family \sfdefault {
% this is a sans font
B
} {
% something else
C
}
}
}
\ExplSyntaxOff
\makeatother
\begin{document}
test \amp\ test
\sffamily
test \amp\ test
\ttfamily
test \amp\ test
\end{document}