我想在类中声明一个变量,该变量从文件的前言中获取字体名称TeX
。类似于\docFont{<Variable>}
。是否有命令可以使 latex 中的空格键无效?例如\docFont{ Arial }
将返回与相同的结果\docFont{Arial}
。
我的myclass.cls
文件是这样的:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2019/04/09 Standard HomeWork Template]
\LoadClass[a4paper,12pt,onecolumn,final]{article}
\RequirePackge{etoolbox}
\def\hFont#1{\gdef\@hFont{#1}}
\def\@hFont{\@latex@warning@no@line{No \noexpand\hFont given}}
\BeforeBeginEnvironment{document}{
\RequirePackage{xepersian}
\settextfont{\@hFont}
}
我的*.Tex
文件是这样的:
\documentclass{myclass}
\hFont{Arial} %Document Persian Font
\begin{document}
something
\end{document}
答案1
您可以使用修剪空间用于此目的的包。
简单示例
\documentclass{article}
\usepackage{trimspaces}
\makeatletter
\newcommand*{\trim}[1]{%
\trim@spaces@noexp{#1}%
}
\makeatother
\begin{document}
\textbar \trim{a bcd ef}\textbar
\textbar \trim{ a bcd ef }\textbar
\end{document}
下面是另一种方法,首先将修剪操作的结果存储在宏(\my@tmp@trimmed
)中,然后扩展该宏:
\documentclass{article}
\usepackage{trimspaces}
\makeatletter
\newcommand*{\trim}[1]{%
\begingroup
\edef\my@tmp@trimmed{\trim@spaces@noexp{#1}}%
\expandafter
\endgroup
\my@tmp@trimmed
}
\makeatother
\begin{document}
X\trim{a bc def}Y
X\trim{ a bc def }Y
\end{document}
可能性概述
这修剪空间根据您的需要,该软件包提供了几种变体:
- 仅左侧、仅右侧或两侧修剪(左侧:
\trim@pre@space
和\trim@pre@space@noexp
;右侧:\trim@post@space
,\trim@post@space@noexp
;两侧:\trim@spaces
,\trim@spaces@noexp
); - 是否要在修剪的同时扩展标记(到目前为止,我选择了
@noexp
示例中的变体,即只修剪而不扩展;否则,请参阅\trim@spaces
包文档及下文)。
它还允许修剪已存在的宏的内容。以下是文档中关于这一点的示例:
\def\b{ b \foo ! }
\trim@spaces@in\b
相当于
\def\b{b \foo !}
\trim@pre@space@in
并\trim@post@space@in
提供仅左侧和仅右侧修剪的类似功能。
\trim@spaces
和之间的区别\trim@spaces@noexp
\trim@spaces
下面的例子说明了和\trim@spaces@noexp
1之间的功能差异:前者从其参数中扩展标记,而后者则不扩展(然后它们可以在“最后一刻”扩展,这通常是所希望的)。
\documentclass{article}
\usepackage{trimspaces}
\makeatletter
\newcommand*{\storeTrimmedImmediateExp}[2]{%
\xdef#1{\trim@spaces{#2}}%
}
\newcommand*{\storeTrimmedNoExp}[2]{%
\xdef#1{\trim@spaces@noexp{#2}}%
}
\makeatother
\newcommand*{\foo}{[default foo]}
\storeTrimmedImmediateExp{\immediateExp}{ a\foo b } % \foo is expanded now
\storeTrimmedNoExp{\delayedExp}{ a\foo b } % \foo is not expanded yet
\renewcommand*{\foo}{[updated foo]}
\begin{document}
\textbar \immediateExp \textbar % there is no \foo inside \immediateExp
\textbar \delayedExp \textbar % \foo is expanded after \delayedExp
\end{document}
极端情况
最后一个例子探讨了几种不同类型的空间的极端情况:
\documentclass{article}
\usepackage{trimspaces}
\makeatletter
\newcommand*{\trim}[1]{%
\trim@spaces@noexp{#1}%
}
\makeatother
% Define \implicitSpace to be \let-equal to a space token
\begingroup
\def\\{\global\let\implicitSpace= }\\ % cf. TeXbook exercise 24.6
\endgroup
\begin{document}
A\trim{a bc def}B
C\trim{ a bc def }D
E\trim{\ a bc def\ }F % control spaces aren't trimmed
% Implicit space tokens are... sometimes trimmed (?)
G\trim{\implicitSpace a bc def\implicitSpace}H
\end{document}
脚注
- 另一个区别是
\trim@spaces@noexp
需要 eTeX 引擎,而不\trim@spaces
需要。
答案2
在这里,我对参数进行预处理\docfont
并将结果传递给\docfontcore
,这仅仅是为了演示的目的,对其参数进行去标记化,以便您可以看到它给出了最初指定的标记,修剪了前导和尾随(但不是中间)空格。
最后的 MWE 示例表明传递宏不会对该方法造成任何阻碍。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{listofitems}
\newcommand\docfont[1]{%
\setsepchar{!!!!}% USE SOMETHING NOT IN THE FONTNAMES
\readlist*\trimmedvar{#1}%
\itemtomacro\trimmedvar[1]\thetrimmedvar%
\expandafter\docfontcore\expandafter{\thetrimmedvar}%
}
\newcommand\docfontcore[1]{[\detokenize{#1}]}
\begin{document}
\docfont{ Arial Bold }
\docfont{Arial Bold }
\docfont{Arial Bold}
\newcommand\myfont{Palatino}
\docfont{ \myfont-oblique }
\end{document}
答案3
我对纯 TeX (不需要任何软件包) 的看法:
\makeatletter
\long\gdef\@calc@trim< #1 >\@/< #2 >\@/< #3 >\@/< #4 >\@/< #5 >\@/< #6 >\@/< #7 >\@/< #8 >\@/< #9 >\@nihil{%
\ifcase\numexpr2#3#8\relax\or#2\or#7\or#5\or#1\or#1\fi%
}
\long\gdef\trim#1{%
\@calc@trim< #1 >\@/< #1>\@/< - >\@/< + >\@/< ? >\@/<#1 >\@/<#1>\@/< 0 >\@/< 2 >\@/< 1 >\@/< 3 >\@/< 2 >\@/< ! >\@nihil%
}
\makeatother
测试:
[\trim{ Arial }]
[\trim{ Arial}]
[\trim{Arial }]
[\trim{Arial}]
[\trim{ }]
[\trim{}]
结果: