当我必须去寻找我的 tex 模板或下载模板或从记忆中重新创建一个模板时,我真的很恼火。是否存在适用于 Linux 的 Latex cli 工具,在终端中,我可以在终端中输入类似以下内容:
latex new article --name MyArticle
它将初始化必要的 tex 文件。
答案1
在我看来,最好的方法是设计自己的脚本,因为你经常需要不同的包和选项。为了方便起见,我设计了一个名为的脚本,edit.sh
如果文件存在,它会调用编辑器,如果文件不存在,它会根据我的需要动态创建一个新的 .tex 文件。shell 脚本的优点是可以根据你的特殊需求调整文件
这是我的edit.sh
#!/bin/ksh
#if the file doesn't exist create it with a template script
if ! [[ -f $1 ]]; then
#checks file extension
case $1 in
# for .tex calls for cnv_tex.sh
*.tex ) cnv_tex.sh $1;;#echo $1 | cnv_tex.pl ;;
#shell
*.sh ) echo "#!/bin/ksh" > $1;;
esac ;
fi
#edit the file with my default editor
$VISUAL $1;;
我过去常常从 Emacs 切换到 Vim,现在我不再依赖编辑器,也不必配置特定于编辑器的模板。
下面是我非常长的 cnv_tex.sh 的摘录。我绕过了字体选择机制,但保留了语言选择机制。总结一下:它要求选择引擎(ConTeXt、LaTeX、XeTeX 或 LuaTeX)。如果选择了 ConTeXt,它会询问我的目的并加载适当的环境。如果选择了 XeTeX、LaTeX 或 LuaTeX,它会要求提供文档类和语言,并根据这些内容填充模板。是的,我不是 shell 专家,所以我的脚本可以更优雅。
#!/bin/ksh
fichier=$1
#function to escape backslash while writing
function bremp {
echo -E $1 >> ${fichier} ;}
#another one to unescape backslash
function rempl {
echo $1 >> ${fichier} ;}
#engine
echo "[l]atex, l[u]alatex, [x]elatex ou [c]ontext ?"
read moteur
#create an array with used languages
echo "langue1 puis autres? en fr de pl ou nom entier"
read babel
set -A langues $babel
#ConTeXt
if [[ $moteur == 'c' ]] ; then
select finalite in article metapost atelier_informatique évaluation documents fiche_methodo sprawdziany cours_lfv buffer ;
do
case $finalite in
évaluation)
cp $HOME/texmf/tex/context/cnv_eval.tex ${fichier} ;;
(article|metapost)
if [[ ${finalite} == "article" ]] ;
then bremp "\setuppapersize[A4]"
bremp "\setuplayout[width=17cm,height=27cm,"
bremp " backspace=2cm,topspace=2cm,header=0cm]"
bremp "\setuphead[title][page=no,align=middle,textstyle=bold]"
bremp "\setuphead[section][textstyle=bold]" ;
fi ;
if [[ ${langues[0]} == "fr" ]] ;
then rempl "\setuplanguage[${langues[0]}]\n [leftquote=\upperrightdoublesixquote"
bremp " rightquote=\upperrightdoubleninequote]";
fi
rempl "\language[${langues[0]}]"
rempl "\n\n\n\\starttext"
if [[ ${finalite} == "metapost" ]] ;
then bremp "\startMPpage"
rempl "\n%variables\n"
bremp "\stopMPpage" ;
fi
bremp "\stoptext" ;;
buffer)
echo "nom du tampon (buffer) ?"
read NomTampon
rempl "\startbuffer[${NomTampon}]\n\stopbuffer" ;;
#loading others environment
*) bremp "\environment env_${finalite}"
rempl "\n\n\starttext\n"
bremp "\stoptext" ;;
esac
break ;
done ;
#LaTeX and Co
else
#classes
select classe in article beamer lfv report book draft moderncv ltugprocp ;
do case $classe in
(article|book|draft)
mainopt=12pt
set -A packages [margin=2cm]{geometry} {url} {graphicx} ;;
beamer)
mainopt=11pt,noamsmath
set -A masques usetheme{} usecolortheme{} useinnertheme{} useoutertheme{} \
setbeamertemplate{blocks}[rounded] setbeamertemplate{navigation%symbols}{} ;;
lfv)
mainopt=12pt,noamsmath,t
set -A packages {lfv}
select couleurs in magpie frigatebird cormorant;
do break ;
done ;;
report)
mainopt=12pt
set -A packages [a4paper,vmargin={3cm,3.5cm},inner=3cm,outer=2cm]{geometry} {url} {graphicx};;
ltugprocp)
mainopt=polish
set -A packages {url};;
esac
break;
done
#title
echo "Titre?"
read titre
echo "Auteur? ([d]t)"
read auteur
case $auteur in
"d") auteur=Damien\ Thiriet;;
esac
#let's write it on the file
bremp "\documentclass[${mainopt}]{${classe}}"
for i in ${packages[*]}; do
bremp "\usepackage$i" ;
done
for i in ${masques[*]}; do
rempl "%\\${i}" ;
done
case $classe in
(beamer)
#navigation symbols
/usr/bin/sed -i '/navigation/s/%symbols/ symbols/' ${fichier} ;;
(lfv)
/usr/bin/sed -i '/documentclass/s/lfv/beamer/' ${fichier}
bremp "\usecolortheme{${couleurs}}";;
esac
############languages
#loop to load languages
i=0
while [[ ${langues[$i]} != '' ]] ; do
#convert codes to babel and polyglossia language names
case ${langues[$i]} in
"de") langues[$i]=german;;
"en") langues[$i]=english;;
"fr") langues[$i]=french;;
"pl") langues[$i]=polish ;;
esac
#increment
((i++));
done
#how many languages
maxi=${#langues[*]}
case $moteur in
(x|u)
#load luaotfload if luatex
rempl "\n\usepackage{ifluatex}"
bremp "\ifluatex"
bremp " \usepackage{luaotfload}"
bremp "\fi"
#polyglossia
bremp "\usepackage{polyglossia}"
#language options
if (( $maxi == 1));
then
rempl "\setdefaultlanguage{${langues[0]}}\n\n";
elif (( $maxi == 2 ));
then
bremp "\setmainlanguage{${langues[0]}}"
rempl "\setotherlanguage{${langues[1]}}\n\n";
elif (( $maxi >= 3 ));
then
bremp "\setmainlanguage{${langues[0]}}"
#je supprime la première langue du vecteur
langues[0]=''
#comme cela langue[*] donne les langues secondaires, tr remplace espace par ,
rempl "\setotherlanguages{$(echo ${langues[*]}|tr ' ' ',')}\n\n";
fi
"l")
for i in $langues;
do
case $i in
polish)
bremp "\usepackage{polski}";;
francais)
bremp "\usepackage{lmodern}";;
esac
done
bremp "\usepackage[utf8]{inputenc}"
if (( $maxi == 1));
then
bremp "\usepackage[${langues[0]}]{babel}";
else
#je place la langue principale en paramètre à part
principale=$langues[0]
#ce qui me permet de la supprimer pour obtenir un vecteur avec les langues secondaires
langues[0]=''
bremp "\usepackage[$(echo ${langues[*]}|tr ' ' ','),$principale]{babel}";
fi;;
esac
#call for bibliography (after polyglossia)
case $classe in
(beamer|book|report|article|draft|ltugprocp)
bremp "%\usepackage[sorting=none]{biblatex}"
bremp "%\bibliography{}";;
esac
#last infos
rempl "\\\title{$titre}\n\\\author{$auteur}\n\date{}\n\n"
rempl "\\\begin{document}\n\\maketitle\n\n\end{document}";
fi
我也大量使用编辑器中的 shell 脚本。如果你读过波兰语,我为 GUST(波兰用户组)写了一篇关于这个主题的论文。