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 \UseFont
einwandfrei funktioniert, \LoadFont
ist dies bei dem Zyklus mit nicht der Fall. Tut von alleine, \LoadFont
was 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, \foreach
Iterationen 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:
Antwort2
Wenn Sie das tun
\foreach \FontName in \FontList {\LoadFont\FontName}
Der \newfontface
Befehl 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, expl3
die 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}
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}