다음 예의 버전 A 부분은 header/footer
패키지의 매크로로 정의한 것입니다 fancyhdr
.
\ifnum...
이 버전은 실행 가능하지만 코드( )의 같은 부분이 두 번 작성되기 때문에 어색한 성과입니다 .
선택적 인수 #2를 제외하고 다른 모든 코드는 완전히 동일합니다. 이를 개선하기 위해 아래의 B버전을 시도해 보았지만 전혀 작동하지 않습니다.
특히 동일한 코드 부분이 클 경우에는 끔찍할 것입니다.
요약하자면, 과도한 중복 코드를 피하기 위해 선택적 인수(존재 여부)를 처리하는 더 좋은 방법이 있습니까?
\documentclass{article}
\usepackage{geometry,fancyhdr,xparse}
\geometry{showframe}
\begin{document}
first page\par\vspace{80em} second page
\pagestyle{fancy}
\fancyhf{}
%Version A: workable %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NewDocumentCommand{\firstpage}{momm}{%
\IfNoValueTF{#2}
{#1{%
\ifnum\value{page}=1
#3% content of header/footer only at the first page
\else
#4% content of header/footer at the rest pages
\fi
}
}
{#1[#2]% the only diferrence between the two branches of \IfNoValueTF is, whether introducing the optional argument #2
{%
\ifnum\value{page}=1
#3% content of header/footer only at the first page
\else
#4% content of header/footer at the rest pages
\fi
}
}
}%\firstpage
% Test
\firstpage{\fancyhead}[c]{only at the first page}{at rest pages}
\firstpage{\rhead}{r first}{r rest}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Version B: not workable %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NewDocumentCommand{\firstpageA}{momm}{%
#1 \IfNoValueTF{#2}{}{[#2]}
\ifnum\value{page}=1
#3% content of header/footer only at the first page
\else
#4% content of header/footer at the rest pages
\fi
}%\firstpageA
% Test
\firstpageA{\fancyhead}[c]{only at the first page}{at rest pages}
\firstpageA{\rhead}{r first}{r rest}
\end{document}
답변1
나는 그런 명령에 어색한 구문을 적용하는 것이 유용하지 않다고 생각합니다.
좀 더 친숙한 구문을 고안하는 데 시간을 좀 더 투자하는 것이 더 보람이 있습니다. 여기서 나는 제안한다
\sethf{
head = <contents of all headers, except possibly the first>,
foot = <contents of all footers, except possibly the first>,
pos = <l|c|r>,
first = <possible exception for first header/footer>,
}
호출에는 head
or 중 하나만 사용해야 합니다 .foot
\sethf
\documentclass{article}
\usepackage{fancyhdr,xparse}
\usepackage[paper=a6paper]{geometry} % smaller pictures
\usepackage{lipsum} % mock text
\pagestyle{fancy}
\fancyhf{}
\ExplSyntaxOn
\NewDocumentCommand{\sethf}{m}
{
\tl_clear:N \l__lyl_hf_pos_tl
\tl_clear:N \l__lyl_hf_first_tl
\tl_clear:N \l__lyl_hf_headfoot_tl
\keys_set:nn { lyl/hf } { #1 }
\lyl_hf_set:
}
\keys_define:nn { lyl/hf }
{
head .code:n = \__lyl_hf_aux:Nn \fancyhead { #1 },
foot .code:n = \__lyl_hf_aux:Nn \fancyfoot { #1 },
pos .tl_set:N = \l__lyl_hf_pos_tl,
first .tl_set:N = \l__lyl_hf_first_tl,
}
\tl_new:N \l__lyl_hf_headfoot_tl
\cs_new_protected:Nn \__lyl_hf_aux:Nn
{
\cs_set_eq:NN \__lyl_hf_temp:w #1
\tl_set:Nn \l__lyl_hf_headfoot_tl { #2 }
}
\cs_new_protected:Nn \lyl_hf_set:
{
\tl_if_empty:NT \l__lyl_hf_first_tl
{
\tl_set_eq:NN \l__lyl_hf_first_tl \l__lyl_hf_headfoot_tl
}
\__lyl_hf_set:NVVV
\__lyl_hf_temp:w % \fancyhead or \fancyfoot
\l__lyl_hf_pos_tl % position
\l__lyl_hf_first_tl % first page
\l__lyl_hf_headfoot_tl % other pages
}
\cs_new_protected:Nn \__lyl_hf_set:Nnnn
{
#1 [ #2 ] { \int_compare:nTF { \value{page} = 1 } { #3 } { #4 } }
}
\cs_generate_variant:Nn \__lyl_hf_set:Nnnn { NVVV }
\ExplSyntaxOff
\sethf{
head = other pages,
first = first page,
pos = c,
}
\sethf{pos = r, foot=\thepage}
\begin{document}
\lipsum[1-2]
\end{document}
질문에 답하려면 중복 코드에 매크로를 사용하세요.
\documentclass{article}
\usepackage{fancyhdr,xparse}
\usepackage[paper=a6paper]{geometry} % smaller pictures
\usepackage{lipsum} % mock text
\pagestyle{fancy}
\fancyhf{}
\NewDocumentCommand{\firstpage}{momm}{%
\IfNoValueTF{#2}
{\setfirstpage{#1}{#3}{#4}}
{\setfirstpage{#1[#2]}{#3}{#4}}%
}
\NewDocumentCommand{\setfirstpage}{mmm}
{
#1{\ifnum\value{page}=1 #2\else #3\fi}
}
\firstpage{\fancyhead}[c]{first page}{other pages}
% can also be \firstpage{\chead}{first page}{other pages}
\begin{document}
\lipsum[1-2]
\end{document}
너~할 것 같다여기의 정의를 다음으로 바꾸십시오.
\ExplSyntaxOn
\NewDocumentCommand{\firstpage}{momm}
{
\exp_last_unbraced:Nf #1 \IfNoValueTF{#2}{}{[#2]}
{
\int_compare:nTF { \value{page}=1 } { #3 } { #4 }
}
}
\ExplSyntaxOff
하지만 그것은 내가 직접 할 수 있는 일이 아닙니다. 코드는 \IfNoValueTF{#2}{}{[#2]}
더 간단하게 \IfValueT{#2}{[#2]}
.
답변2
특정 예의 경우 단순히 \thispagestyle
첫 번째 페이지에서 사용하는 것이 더 나을 수 있지만 일반적인 질문의 경우 선택적 인수에 대한 테스트가 끝날 때까지 인수를 사전 스캔하는 것을 피할 수 있으며 도우미 매크로는 코드 중복을 피할 수 있습니다.
\documentclass{article}
\usepackage{geometry,fancyhdr,xparse}
\geometry{showframe}
\begin{document}
first page\par\vspace{80em} second page
\pagestyle{fancy}
\fancyhf{}
\def\fpageTF#1#2#3{#1{\ifnum\value{page}=1 #2\else #3\fi}}
\NewDocumentCommand{\firstpage}{mo}{%
\IfNoValueTF{#2}{\fpageTF{#1}}{\fpageTF{#1[#2]}}}
% Test
\firstpage{\fancyhead}[c]{only at the first page}{at rest pages}
\firstpage{\rhead}{r first}{r rest}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\end{document}