소개
MWE가 길어서 유감입니다. 하지만 MWE를 더 짧게 만들 수 없었고 여전히 내 문제를 설명할 수 없었습니다. 이번에도 저는 대학의 시험 생성을 간소화하기 위해 노력하고 있습니다. 아래 예에서 사용자는 다음을 사용하여 더 많은 강의를 추가할 수 있습니다.
\defineInfo{jane}{
name=Jane Doe,
phone=75123123,
}
(구문을 만드는 데 도움을 받은 곳은 다음과 같습니다.사전으로서의 연락처 목록) 다음을 사용하여 시험에 대한 정보를 추가합니다.
\FrontpageUiTsetup{
contact = jane,
}
(지금은 도움을 받아라벨이 지정된 입력 매개변수) 물론 마지막 명령에는 내 질문과 관련없이 더 많은 매개 변수가 있습니다. 이제 이 두 답변을 결합하여 ID를 사용하여 강사를 참조한 다음 해당 부분을 에서 인쇄할 수 있습니다 \FrontpageUiT
.
처음으로 글을 써봤는데
\ifx\@contact\@empty\else
\contactname & \contactInfo{\@contact}{name}\\%
\fi
그러나 \contactInfo
명령이 이전에 확장되어 \@contact
아무것도 출력하지 않는 것 같습니다. 약간의 인터넷 검색 후 다음을 사용하여 \@contact
먼저 확장할 수 있었습니다.
\newcommand{\expandMacro}[1]{
\begingroup\edef\x{\endgroup
\noexpand#1%
}\x
}
문제
그래서 여기에 내 문제가 있습니다.
- @phone과 @mobile의 기본값이 각각 회선
\contactInfo{\@contact}{mobile}
과 @mobile로 정의되기를 원합니다.\contactInfo{\@contact}{phone}
문제는 라인을 원할 때 발생합니다.
\contactmobile & \@mobile
휴대폰 번호가 제공되지 않는 경우 공백으로 표시됩니다. 예:
mobile .tl_set:N = \@mobile,
mobile .initial:n = {\expandMacro{\contactInfo{\@contact}{mobile}}},
phone .tl_set:N = \@phone,
phone .initial:n = {\expandMacro{\contactInfo{\@contact}{phone}}},
.
.
.
\ifx\@contact\@empty\else
\contactname & \expandMacro{\contactInfo{\@contact}{name}}\\%
\fi
\ifx\@mobile\@empty\else
\contactmobile & \@mobile\\%
\fi
\ifx\@phone\@empty\else
\contactphone & \@phone\\%
.
.
.
\defineInfo{jane}{
name=Jane Doe,
phone=75123123,
}
\FrontpageUiTsetup{
contact = jane,
}
\begin{document}
\FrontpageUiT
\end{document}
Jane에게는 휴대폰 번호가 없으므로 출력은 다음과 같습니다.
Contact Jane Doe
Phone 75 12 31 23
대신에 나는 직면했다
Contact Jane Doe
Mobile
Phone 75 12 31 23
문제는 코드가 \contactInfo{\@contact}{mobile}
비어 있다는 것을 인식할 만큼 빠르게 확장될 수 없다는 것입니다. 좀 더 구글링을 하다가 발견한
\newcommand{\IfNoText}[3]{%
\sbox0{#1}%
\ifdim\wd0=0pt %
{#2}% if #1 is empty
\else%
\ifdim0pt=\dimexpr\ht0+\dp0\relax
{#2}% if #1 is empty
\else
{#3}% if #1 is not empty
\fi
\fi%
}
출력이 비어 있는지 감지할 수 있습니다. 다만, 앰퍼샌드(&)를 지원하지 않아서 제 테이블에서는 사용할 수 없습니다. 예
\IfNoText{\@mobile}{}{Mobile & \@mobile \\}
나에게 오류가 발생합니다. 또한 \IfNoText
내 문서의 앞부분에서 \@mobile
. 그러나 이들 역시 충분히 빠르게 확장되지 않았습니다.
- 의 용어로 제공될 때
\@mobile
및 가 비어 있는지 더 빨리 확인할 수 있는 방법이 있습니까 ?@phone
\contactInfo
암호
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{xparse}
\usepackage{xfp}
\newcommand{\IfNoText}[3]{%
\sbox0{#1}%
\ifdim\wd0=0pt %
{#2}% if #1 is empty
\else%
\ifdim0pt=\dimexpr\ht0+\dp0\relax
{#2}% if #1 is empty
\else
{#3}% if #1 is not empty
\fi
\fi%
}
\newcommand{\expandMacro}[1]{
\begingroup\edef\x{\endgroup
\noexpand#1%
}\x
}
\ExplSyntaxOn
\NewDocumentCommand{\defineInfo}{mm}
{
\prop_new:c { \__nebu_contact_prop:n { #1 } }
\prop_gset_from_keyval:cn { \__nebu_contact_prop:n { #1 } } { #2 }
}
\NewDocumentCommand{\contactInfo}{mm}
{
\str_case:nnF { #2 }
{
{phone} { \nebu_phone:e { \prop_item:cn { \__nebu_contact_prop:n { #1 } } { #2 } } }
{mobile} { \nebu_phone:e { \prop_item:cn { \__nebu_contact_prop:n { #1 } } { #2 } } }
}
{ \prop_item:cn { \__nebu_contact_prop:n { #1 } } { #2 } }
}
% syntactic sugar
\cs_new:Nn \__nebu_contact_prop:n
{
g_nebu_contact_\str_lowercase:n { #1 }_prop
}
%%% formatting phone numbers
\NewDocumentCommand{\phone}{m}
{
\nebu_phone:n { #1 }
}
\tl_new:N \l__nebu_phone_tl
\cs_new_protected:Nn \nebu_phone:n
{
\tl_set:Nn \l__nebu_phone_tl { #1 }
\tl_remove_all:Nn \l__nebu_phone_tl { ~ }
\int_compare:nTF { \tl_count:N \l__nebu_phone_tl = 8 }
{
\__nebu_phone_eight:V \l__nebu_phone_tl
}
{
\tl_use:N \l__nebu_phone_tl
}
}
\cs_generate_variant:Nn \nebu_phone:n { e }
\cs_new:Nn \__nebu_phone_eight:n
{
\str_case_e:nnF { \tl_head:n { #1 } }
{
{4}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
{8}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
{9}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
}
{
\__nebu_phone_ii:nnnnnnnn #1
}
}
\cs_generate_variant:Nn \__nebu_phone_eight:n { V }
\cs_new:Nn \__nebu_phone_iii_ii_iii:nnnnnnnn { #1#2#3\hspace{1ex}#4#5\hspace{1ex}#6#7#8 }
\cs_new:Nn \__nebu_phone_ii:nnnnnnnn { #1#2\hspace{0.6666ex}#3#4\hspace{0.6666ex}#5#6\hspace{0.6666ex}#7#8 }
\ExplSyntaxOff
% https://tex.stackexchange.com/a/504129/8306
%
% This creates the backbone for the frontpage. One can add new keys here
\makeatletter
% Provide commands.
\ExplSyntaxOn
% Provide keys.
\keys_define:nn { babylonia }
{
contact .tl_set:N = \@contact,
mobile .tl_set:N = \@mobile,
mobile .initial:n = {\expandMacro{\contactInfo{\@contact}{mobile}}},
phone .tl_set:N = \@phone,
phone .initial:n = {\expandMacro{\contactInfo{\@contact}{phone}}},
}
% Provide key setting command.
\NewDocumentCommand\FrontpageUiTsetup{ m }{
\keys_set:nn { babylonia } { #1 }
}
\ExplSyntaxOff
% Provide names.
\newcommand*\contactname{Contact}
\newcommand*\contactmobile{Mobile}
\newcommand*\contactphone{Phone}
% The typesetting command.
\newcommand\FrontpageUiT{%
\noindent
\begin{tabular}{p{0.2\textwidth} p{\dimexpr 0.8\textwidth - 4\tabcolsep}}
\ifx\@contact\@empty\else
\contactname & \expandMacro{\contactInfo{\@contact}{name}}\\%
\fi
\ifx\@mobile\@empty\else
\contactmobile & \@mobile\\%
\fi
\ifx\@phone\@empty\else
\contactphone & \@phone\\%
\fi
\end{tabular}%
}
\makeatother
% ==============================================================================
% User interface below here
% ==============================================================================
% This adds contacts to be used in the UiT frontpage
% Example:
%
% \defineInfo{joe}{
% name=Joe Doe, mobile=32132132, phone=93123123,
% }
\defineInfo{jane}{
name=Jane Doe,
phone=75123123,
}
\FrontpageUiTsetup{
contact = jane,
}
\begin{document}
\FrontpageUiT
\end{document}
답변1
두 개의 명령을 추가합니다. 하나는 속성 존재 여부를 테스트하기 위한 것이고, 다른 하나는 정보를 조판하기 위한 것입니다.
\NewExpandableDocumentCommand{\contactTestTF}{mmmm}
{% #1 = contact, #2 = property to test, #3 = code for true, #4 = code for false
\prop_if_in:cnTF { \__nebu_contact_prop:n { #1 } } { #2 } { #3 } { #4 }
}
\NewDocumentCommand{\FrontpageUiTsetup}{m}
{
\begin{tabular}{@{} l l @{}}
\contactname & \contactInfo{#1}{name} \\
\contactTestTF{#1}{mobile}{\mobilename & \contactInfo{#1}{mobile} \\}{}
\contactTestTF{#1}{phone}{\phonename & \contactInfo{#1}{phone} \\}{}
\end{tabular}
}
전체 예:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\defineInfo}{mm}
{
\prop_new:c { \__nebu_contact_prop:n { #1 } }
\prop_gset_from_keyval:cn { \__nebu_contact_prop:n { #1 } } { #2 }
}
\NewExpandableDocumentCommand{\contactInfo}{mm}
{
\str_case:nnF { #2 }
{
{phone} { \nebu_phone:e { \prop_item:cn { \__nebu_contact_prop:n { #1 } } { #2 } } }
{mobile} { \nebu_phone:e { \prop_item:cn { \__nebu_contact_prop:n { #1 } } { #2 } } }
}
{ \prop_item:cn { \__nebu_contact_prop:n { #1 } } { #2 } }
}
\NewExpandableDocumentCommand{\contactTestTF}{mmmm}
{% #1 = contact, #2 = property to test, #3 = code for true, #4 = code for false
\prop_if_in:cnTF { \__nebu_contact_prop:n { #1 } } { #2 } { #3 } { #4 }
}
\NewDocumentCommand{\FrontpageUiTsetup}{m}
{
\begin{tabular}{@{} l l @{}}
\contactname & \contactInfo{#1}{name} \\
\contactTestTF{#1}{mobile}{\mobilename & \contactInfo{#1}{mobile} \\}{}
\contactTestTF{#1}{phone}{\phonename & \contactInfo{#1}{phone} \\}{}
\end{tabular}
}
% syntactic sugar
\cs_new:Nn \__nebu_contact_prop:n
{
g_nebu_contact_\str_lowercase:n { #1 }_prop
}
%%% formatting phone numbers
\NewDocumentCommand{\phone}{m}
{
\nebu_phone:n { #1 }
}
\tl_new:N \l__nebu_phone_tl
\cs_new_protected:Nn \nebu_phone:n
{
\tl_set:Nn \l__nebu_phone_tl { #1 }
\tl_remove_all:Nn \l__nebu_phone_tl { ~ }
\int_compare:nTF { \tl_count:N \l__nebu_phone_tl = 8 }
{
\__nebu_phone_eight:V \l__nebu_phone_tl
}
{
\tl_use:N \l__nebu_phone_tl
}
}
\cs_generate_variant:Nn \nebu_phone:n { e }
\cs_new:Nn \__nebu_phone_eight:n
{
\str_case_e:nnF { \tl_head:n { #1 } }
{
{4}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
{8}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
{9}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
}
{
\__nebu_phone_ii:nnnnnnnn #1
}
}
\cs_generate_variant:Nn \__nebu_phone_eight:n { V }
\cs_new:Nn \__nebu_phone_iii_ii_iii:nnnnnnnn { #1#2#3\nobreakspace#4#5\nobreakspace#6#7#8 }
\cs_new:Nn \__nebu_phone_ii:nnnnnnnn { #1#2\nobreakspace#3#4\nobreakspace#5#6\nobreakspace#7#8 }
\ExplSyntaxOff
\newcommand{\contactname}{Contact}
\newcommand{\mobilename}{Mobile}
\newcommand{\phonename}{Phone}
\defineInfo{jane}{
name=Jane Doe,
mobile=32132132,
phone=45123123,
}
\defineInfo{joe}{
name=Joe Doe,
%mobile=32132132,
phone=93123123,
}
\defineInfo{richard}{
name=Richard Roe,
mobile=32132132,
phone=83123123,
}
\begin{document}
\contactInfo{Jane}{name} has \contactInfo{jane}{mobile} mobile phone.
\contactInfo{riCHard}{phone} is \contactInfo{Richard}{name}'s phone.
\bigskip
\FrontpageUiTsetup{jane}
\bigskip
\FrontpageUiTsetup{joe}
\end{document}