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 \UseFont
funciona bien, el que tiene \LoadFont
no. Por sí solo, \LoadFont
hace 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 \foreach
realizar 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:
Respuesta2
Cuando tu lo hagas
\foreach \FontName in \FontList {\LoadFont\FontName}
la \newfontface
instrucció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 expl3
que 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}
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}