简单示例

简单示例

我想在类中声明一个变量,该变量从文件的前言中获取字体名称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@noexp1之间的功能差异:前者从其参数中扩展标记,而后者则不扩展(然后它们可以在“最后一刻”扩展,这通常是所希望的)。

\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}

在此处输入图片描述

脚注

  1. 另一个区别是\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{}]

结果:

\trim 的结果

相关内容