我正在用 LaTeX 编写我的简历,现在我有下面的代码,我用它创建两个命令\eng{}
,\ita{}
它允许我隐藏我不想要的语言的文本。
%% English %%
\newtoggle{eng}
\newcommand{\eng}[1]{\iftoggle{eng}{#1}{}}
\ifthenelse{\equal{\detokenize{cv}}{\jobname}}{
\toggletrue{eng}
}{
\togglefalse{eng}
}
%% Italian %%
\newtoggle{ita}
\newcommand{\ita}[1]{\iftoggle{ita}{#1}{}}
\ifthenelse{\equal{\detokenize{cv-ita}}{\jobname}}{
\toggletrue{ita}
}{
\togglefalse{ita}
}
这些切换是根据命令行上的参数设置的,如果没有传递参数,则只保留英语,如果命令行如下所示:
pdflatex -jobname=cv-ita cv
那么命令内的所有内容\eng{}
都会被隐藏,只留下意大利语。
我希望改进这一点,这样如果没有意大利语文本,就可以使用英语文本。不幸的是,用 TeX 编程对我来说相当困难。
你有什么建议吗?
更新 1
这就是我目前使用上面定义的命令的方式:
\cvsection{ \eng{EDUCATION}
\ita{FORMAZIONE}}
问题是,如果我只有\eng{EDUCATION}
并且使用标志调用编译器,ita
我会得到一个错误,因为里面没有文本\cvsection
。我希望命令返回到英文文本,而不是得到错误。
我认为实现此目的的最佳方法是定义一个新命令,例如:
\lan{English text}{Italian text}
当没有意大利语文本时,默认为英语。可以吗?
答案1
您可以根据作业名称选择语言。我调用了主文件fabbri.tex
,然后通过以下方式调用 LaTeX
pdflatex -jobname=fabbri-ita fabbri
pdflatex -jobname=fabbri-eng fabbri
以下是代码;变量部分作为“多个参数”传递给\lc
。当然,从\ExplSyntaxOn
到 的部分\ExplSyntaxOff
可以放在lcsetup.tex
文件中\input
。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[italian,french,english]{babel}
\ExplSyntaxOn
% the main command
\NewExpandableDocumentCommand{\lc}{m} % language choice
{
\fabbri_lc:n { #1 }
}
% we can change the language mid document
\NewDocumentCommand{\setlclanguage}{m}
{
\fabbri_lc_set:n { #1 }
}
% variables
\str_new:N \l_fabbri_lc_lang_str
\str_new:N \l_fabbri_lc_fallback_str
% internal functions
\cs_new:Nn \fabbri_lc:n
{
\str_case:VnF \l_fabbri_lc_lang_str
{ #1 }
{ \str_case:Vn \l_fabbri_lc_fallback_str { #1 } }
}
\cs_new_protected:Nn \fabbri_lc_set:n
{
\str_set:Nn \l_fabbri_lc_lang_str { #1 }
\fabbri_lc:n
{
{ita}{\selectlanguage{italian}}
{fra}{\selectlanguage{french}}
{eng}{\selectlanguage{english}}
}
}
\cs_generate_variant:Nn \fabbri_lc_set:n { e }
% setup
% set the default language based on \jobname of the form <name>-<lang>
\seq_set_split:NnV \l_tmpa_seq { - } \c_sys_jobname_str
\fabbri_lc_set:e { \seq_item:Nn \l_tmpa_seq { 2 } }
% set the fallback language
\str_set:Nn \l_fabbri_lc_fallback_str { eng } % choose the fallback language
\ExplSyntaxOff
\begin{document}
\section{\lc{
{ita}{Titolo}
{fra}{Titre}
{eng}{Title}
}}
\lc{
{ita}{Questo documento è in italiano}
{fra}{Ce document est in français}
{eng}{This document is in English}
}
% French is missing here
\lc{
{ita}{Testo}
{eng}{Text}
}
% change the default language
\setlclanguage{fra}
\section{\lc{
{ita}{Titolo}
{fra}{Titre}
{eng}{Title}
}}
\lc{
{ita}{Questo documento è in italiano}
{fra}{Ce document est in français}
{eng}{This document is in English}
}
% French is missing here
\lc{
{ita}{Testo}
{eng}{Text}
}
\end{document}
输出ita
输出eng
答案2
这能达到你想要的效果吗?
\documentclass{article}
\usepackage{etoolbox}
\newtoggle{ita}
\toggletrue{ita}
\newcommand\lan[2]{%
\ifboolexpe{
(not togl {ita}) or test{\ifstrempty{#2}}
}{#1}{#2}%
}
\begin{document}
\lan{English}{Italian}
\lan{Only English}{}
\end{document}
请注意,我甚至没有为英语版本定义切换按钮,只有“意大利语或非意大利语”。
编辑:按照评论的要求,考虑三种语言(虽然不是非常优雅的代码,但它有效):
\documentclass{article}
\usepackage{etoolbox}
\newtoggle{ita}
\newtoggle{swe}
\newcommand\lan[3]{%
\ifboolexpe {test{\ifstrempty{#2}} or not togl{ita}}
{%
\ifboolexpe {test{\ifstrempty{#3}} or not togl{swe}}
{#1}
{#3}%
}
{#2}%
}
\begin{document}
\textbf{English:}\par
\lan{English}{Italian}{Swedish}\par
\lan{English}{Italian}{}\par
\lan{English}{}{Swedish}\par
\lan{English}{}{}\par
\textbf{Swedish:}\par
\toggletrue{swe}
\lan{English}{Italian}{Swedish}\par
\lan{English}{Italian}{}\par
\lan{English}{}{Swedish}\par
\lan{English}{}{}\par
\textbf{Italian:}\par
\toggletrue{ita}
\togglefalse{swe}
\lan{English}{Italian}{Swedish}\par
\lan{English}{Italian}{}\par
\lan{English}{}{Swedish}\par
\lan{English}{}{}\par
\end{document}