Cargando una variedad de fuentes con fontspec y pgffor

Cargando una variedad de fuentes con fontspec y pgffor

Estoy intentando producir un documento para comparar varias fuentes. Me gustaría analizar una matriz para cargarlos y probarlos todos.

Esto es lo que he hecho:

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

Si bien el ciclo con \UseFontfunciona bien, el que tiene \LoadFontno. Por sí solo, \LoadFonthace lo que se espera.

Creo que esto podría ser un problema de expansión, pero no estoy seguro de dónde se encuentra exactamente; Los intentos ciegos no llevaron a ninguna parte.

¿Qué pasa con el ciclo de carga?

Respuesta1

Como ya se explicó, el comportamiento que observó proviene de la característica establecida de \foreachrealizar sus iteraciones dentro de grupos que limitan el alcance.

Aquí está con \xintFor. Cambié a otra fuente porque no tengo Lato instalado.

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

cita en bloque

Respuesta2

Cuando tu lo hagas

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

la \newfontfaceinstrucción se realiza dentro de un grupo, por lo que la definición de la fuente se pierde tan pronto como finaliza el grupo. Esta es una característica de \foreach.

Aquí hay un conjunto de macros expl3que pueden brindarle algunas ideas para ampliarlas.

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

Tenga en cuenta que \exp_args:Nc \newfontface { #1 } { #1 }es esencialmente lo mismo que

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

ingrese la descripción de la imagen aquí

Si desea utilizar un nombre simbólico para una lista, defina una 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}

información relacionada