Fontspec 및 pgffor를 사용하여 글꼴 배열 로드

Fontspec 및 pgffor를 사용하여 글꼴 배열 로드

여러 글꼴을 비교하기 위한 문서를 제작하려고 합니다. 배열을 구문 분석하여 모두 로드하고 사용해 보고 싶습니다.

이것이 내가 한 일입니다:

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

가 있는 사이클은 \UseFont잘 작동하지만, 가 있는 사이클은 \LoadFont그렇지 않습니다. 자체적으로 \LoadFont예상한 대로 수행됩니다.

나는 이것이 확장 문제일 수 있다고 생각하지만 그것이 정확히 어디에 있는지는 잘 모르겠습니다. 맹목적인 시도는 아무데도 이루어지지 않았습니다.

로딩 주기에 어떤 문제가 있나요?

답변1

이미 설명했듯이, 관찰한 동작은 \foreach범위 제한 그룹 내에서 반복을 수행하는 설정된 기능에서 비롯됩니다.

여기에 있습니다 \xintFor. Lato가 설치되어 있지 않아서 다른 글꼴로 전환했습니다.

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

인용구

답변2

당신이 할 때

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

명령 \newfontface은 그룹 내에서 수행되므로 그룹이 끝나자마자 글꼴 정의가 손실됩니다. 이것은 의 특징입니다 \foreach.

expl3확장을 위한 몇 가지 아이디어를 제공할 수 있는 매크로 세트는 다음과 같습니다 .

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

본질적 으로 다음 \exp_args:Nc \newfontface { #1 } { #1 }과 동일합니다.

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

여기에 이미지 설명을 입력하세요

목록에 기호 이름을 사용하려면 *-변형을 정의하세요.

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

관련 정보