Laden eines Arrays von Schriftarten mit Fontspec und pgffor

Laden eines Arrays von Schriftarten mit Fontspec und pgffor

Ich versuche, ein Dokument zu erstellen, um eine Reihe von Schriftarten zu vergleichen. Ich möchte ein Array analysieren, um sie alle zu laden und auszuprobieren.

Folgendes habe ich getan:

\documentclass{article}

\usepackage{lipsum}
\usepackage{pgffor}
\usepackage{fontspec}

\def\LoadFont#1{\expandafter\newfontface\csname#1\endcsname{#1}}
\def\UseFont#1{\csname#1\endcsname}

\def\FontList{Charter,Lato,Linux Libertine O}

% these work just fine
%\LoadFont{Charter}
%\LoadFont{Lato}
%\LoadFont{Linux Libertine O}

% THIS DOES NOT WORK
\foreach \FontName in \FontList {\LoadFont\FontName}

\begin{document}
\foreach \FontName in \FontList {\UseFont\FontName\lipsum[1]}
\end{document}

Während der Zyklus mit \UseFonteinwandfrei funktioniert, \LoadFontist dies bei dem Zyklus mit nicht der Fall. Tut von alleine, \LoadFontwas erwartet wird.

Ich denke, dass es sich hier um ein Erweiterungsproblem handeln könnte, bin mir aber nicht sicher, wo genau es liegt; blinde Versuche führten nirgendwo hin.

Was ist mit dem Ladezyklus los?

Antwort1

Wie bereits erläutert, ist das von Ihnen beobachtete Verhalten auf die etablierte Funktion zurückzuführen, \foreachIterationen innerhalb von Gruppen mit begrenztem Umfang durchzuführen.

Hier ist es mit \xintFor. Ich habe zu einer anderen Schriftart gewechselt, da ich Lato nicht installiert habe.

\documentclass{article}

\usepackage{lipsum}
\usepackage{xinttools}
\usepackage{fontspec}

\def\LoadFont#1{\expandafter\newfontface\csname#1\endcsname{#1}}
\def\UseFont#1{\csname#1\endcsname}

% original
% \def\FontList{Charter,Lato,Linux Libertine O}
% as I don't have Lato:

\def\FontList {Charter, TeX Gyre Heros, Linux Libertine O}

\xintFor #1 in \FontList \do {\LoadFont {#1}}

\begin{document}

\xintFor #1 in \FontList \do {\UseFont {#1}\lipsum[1]}

\end{document}

% Local Variables:
% TeX-engine: xetex
% End:

Blockquote

Antwort2

Wenn Sie das tun

\foreach \FontName in \FontList {\LoadFont\FontName}

Der \newfontfaceBefehl wird innerhalb einer Gruppe ausgeführt, so dass die Definition der Schriftart verloren geht, sobald die Gruppe endet. Dies ist eine Funktion von \foreach.

Hier ist eine Reihe von Makros, expl3die Ihnen einige Ideen für deren Erweiterung geben können.

\documentclass{article}

\usepackage{fontspec}
\usepackage{lipsum}

\ExplSyntaxOn
\NewDocumentCommand{\LoadFont}{m}
 {
  \exp_args:Nc \newfontface { #1 } { #1 }
 }
\NewDocumentCommand{\LoadFonts}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \LoadFont{##1}
   }
 }
\NewDocumentCommand{\UseFont}{m}
 {
  \use:c { #1 }
 }
\NewDocumentCommand{\UseFonts}{m +m}
 {
  \clist_map_inline:nn { #1 }
   {
    \group_begin:
    \UseFont{##1} ##1:~#2
    \group_end:
   }
 }
\ExplSyntaxOff

\LoadFonts{Charter,Lato,Linux Libertine O}

\begin{document}

\UseFonts{Charter,Lato,Linux Libertine O}{\lipsum[2]}

\end{document}

Beachten Sie, dass dies \exp_args:Nc \newfontface { #1 } { #1 }im Wesentlichen dasselbe ist wie

\expandafter\newfontface\csname #1\endcsname{#1}

Bildbeschreibung hier eingeben

Wenn Sie einen symbolischen Namen für eine Liste verwenden möchten, definieren Sie eine *-Variante:

\documentclass{article}

\usepackage{fontspec}
\usepackage{lipsum}

\ExplSyntaxOn
\NewDocumentCommand{\LoadFont}{m}
 {
  \exp_args:Nc \newfontface { #1 } { #1 }
 }
\NewDocumentCommand{\LoadFonts}{sm}
 {
  \IfBooleanTF{#1}
   { \clist_map_inline:Nn #2 }
   { \clist_map_inline:nn { #2 } }
   {
    \LoadFont{##1}
   }
 }
\NewDocumentCommand{\UseFont}{m}
 {
  \use:c { #1 }
 }
\NewDocumentCommand{\UseFonts}{s m +m}
 {
  \IfBooleanTF{#1}
   { \clist_map_inline:Nn #2 }
   { \clist_map_inline:nn { #2 } }
   {
    \group_begin:
    \UseFont{##1} ##1:~#3
    \group_end:
   }
 }
\ExplSyntaxOff

%\LoadFonts{Charter,Lato,Linux Libertine O}

\newcommand\FontList{Charter,Lato,Linux Libertine O}
\LoadFonts*{\FontList}

\begin{document}

%\UseFonts{Charter,Lato,Linux Libertine O}{\lipsum[2]}

\UseFonts*{\FontList}{\lipsum[2]}

\end{document}

verwandte Informationen