여러 글꼴을 비교하기 위한 문서를 제작하려고 합니다. 배열을 구문 분석하여 모두 로드하고 사용해 보고 싶습니다.
이것이 내가 한 일입니다:
\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}