#!/bin/bash #密碼變數 password="" #安裝texlive installTex(){ if [ "$1" = "1" ]; then echo "==>texlive簡單安裝..." sudo -K echo $password| sudo -S apt-get -y install texlive texlive-math-extra texlive-latex-base texlive-latex-extra texlive-latex-recommended texlive-pictures texlive-science texlive-bibtex-extra texlive-common latex-beamer elif [ "$1" = "2" ]; then echo "==>texlive完整安裝..." sudo -K echo $password| sudo -S apt-get -y install texlive-full latex-beamer else echo "==>不安裝texlive" fi } #安裝CJK installCJK(){ if [ "$1" = "1" ]; then echo "==>CJK中文支援..." sudo -K echo $password| sudo -S apt-get -y install latex-cjk-chinese ttf-arphic-* hbf-* elif [ "$1" = "2" ]; then echo "==>CJK完全支援..." sudo -K echo $password| sudo -S apt-get -y install latex-cjk-all else echo "==>不安裝CJK" fi } #安裝fontforge installFontforge(){ if [ "$1" = "1" ]; then sudo -K echo $password| sudo -S apt-get -y install fontforge else echo "==>不安裝fontforge" fi } #進度列表 stepEcho(){ case "$1" in 1) echo "安裝Texlive和一些常用宏包配置";; 2) echo "安裝CJK包配置";; 3) echo "安裝fontforge配置";; 4) echo "確認subfonts.pe和Unicode.sfd檔案路徑";; 5) echo "設定CJK字型引用名";; 6) echo "正式安裝texlive";; 7) echo "正式安裝CJK";; 8) echo "正式安裝fontforge";; 9) echo "正式檢查subfonts.pe和Unicode.sfd存在性";; *) echo "迴圈處理字型中...";; esac } #產生map檔案 makemap(){ for i in *.tfm do echo "${i%.tfm} ${i%.tfm} < ${i%.tfm}.pfb" >>$1 done } #檢測傳回值錯誤提示,和$?配合 perr(){ if [ "$1" != "0" ]; then echo "[錯誤!]錯誤碼="$1 fi } ################main################ proc="0" #進度參數 procFile="./texsetup.sh_procFile" #進度記錄檔案 maprec="./texsetup.sh_maprec" #記錄產生的map列表 subfontsPath="/usr/share/latex-cjk-common/utils/subfonts/subfonts.pe" #subfonts.pe檔案的預設位置 UnicodePath="/usr/share/texmf/fonts/sfd/Unicode.sfd" #Unicode.sfd檔案的預設位置 findpath="/usr" #如果上面兩個檔案找不到,預設到這個目錄下找 #CJK路徑 mapPath="$HOME/.texmf-var/fonts/map/dvips/CJK/" tfmPath="$HOME/.texmf-var/fonts/tfm/CJK/" #+"citename" typePath="$HOME/.texmf-var/fonts/type1/CJK/" #+"citename" encPath="$HOME/.texmf-var/tex/latex/CJK/" #+"encoding" #開始歡迎資訊 clear echo "==============================================================" echo "[[Texlive+Latex+CJK+字型配置]]" echo "使用方法:" echo "將需要添加的字型檔都放到一個可寫的臨時目錄(比如~/tempfont)裡,然後將指令碼" echo "檔案也放到該目錄下,運行即可,注意不要用root許可權運行本指令碼!!!" echo "==============================================================" usernow=`whoami` if [ "$usernow" = "root" ]; then echo "不能用root許可權運行本指令碼!" exit 1 fi echo "現在才需要輸入sudo密碼~" echo -n "password:" stty -echo read password stty echo echo "輸入完畢" sudo -K echo "檢測當前許可權..." echo $password |sudo -S whoami success=`echo $?` if [ "$success" = "0" ];then echo "密碼輸入正確" else echo "密碼輸入錯誤" exit 1 fi echo "==============================================================" echo "完成後是否刪掉臨時目錄(刪掉不影響字型使用)?"`pwd` RMYES="1" OPTIONS="刪掉 保留" select opt in $OPTIONS;do if [ "$opt" = "刪掉" ]; then RMYES="1" break elif [ "$opt" = "保留" ]; then RMYES="0" break else echo "錯誤選擇!" fi done echo "==========================================================" #檢測系統資訊 echo "系統資訊檢測" echo "----------------------------------" echo "系統資訊:"`cat /proc/version` sysinfo=`cat /proc/version |egrep -i "ubuntu|debian"` if [ -z "$sysinfo" ]; then echo "你的系統不是ubuntu/debian,某些步驟可能不能正常工作:" OPTIONS="繼續 退出" select opt in $OPTIONS;do if [ "$opt" = "繼續" ]; then break elif [ "$opt" = "退出" ]; then exit 0 else echo "錯誤選擇!" fi done fi encoding=`env |grep -i '^lang'` encoding=${encoding##*.} echo "編碼:"$encoding if [ "${encoding:0:3}" != "UTF" ] && [ "${encoding:0:3}" != "utf" ]; then echo "您當前系統預設編碼不是UTF8,其他編碼未測試可能支援不好,是否繼續?" OPTIONS="繼續 退出" select opt in $OPTIONS;do if [ "$opt" = "繼續" ]; then break elif [ "$opt" = "退出" ]; then exit 0 else echo "錯誤選擇!" fi done else encoding="UTF8" fi echo "==========================================================" #0:查看進度記錄是否存在 echo "查看是否存在進度記錄" echo "<注意重啟或登出可能會導致記錄消失>" echo "----------------------------------" if [ -e "$procFile" ];then proc=`cat $procFile` echo -n "存在進度記錄"$proc"=>" stepEcho $proc OPTIONS="從進度記錄處開始 從頭開始" select opt in $OPTIONS;do if [ "$opt" = "從進度記錄處開始" ]; then echo "正準備從進度記錄處開始..." break elif [ "$opt" = "從頭開始" ]; then echo "正準備從頭開始..." proc="1" break else echo "錯誤選擇!" fi done else echo "無進度記錄,從頭開始..." proc="1" fi echo "==========================================================" #1:安裝Texlive和一些常用宏包配置 if [ "$proc" = "1" ]; then echo "安裝Texlive和一些常用宏包" echo "<具體配置請閱讀指令碼installTex函數>" echo "----------------------------------" OPTIONS="簡單安裝 完整安裝 跳過本步" select opt in $OPTIONS;do if [ "$opt" = "簡單安裝" ]; then s1="1" break elif [ "$opt" = "完整安裝" ]; then s1="2" break elif [ "$opt" = "跳過本步" ]; then s1="0" break else echo "錯誤選擇!" fi done proc="2" echo $proc > $procFile echo "==========================================================" fi #2:安裝CJK包配置 if [ "$proc" = "2" ]; then echo "安裝CJK包" echo "<簡單安裝=中文支援>" echo "<完整安裝=中日韓文等支援>" echo "----------------------------------" OPTIONS="簡單安裝 完整安裝 跳過本步" select opt in $OPTIONS;do if [ "$opt" = "簡單安裝" ]; then s2="1" break elif [ "$opt" = "完整安裝" ]; then s2="2" break elif [ "$opt" = "跳過本步" ]; then s2="0" break else echo "錯誤選擇!" fi done proc="3" echo $proc > $procFile echo "==========================================================" fi #3:安裝fontforge配置 if [ "$proc" = "3" ]; then echo "安裝fontforge" echo "<產生字型用,請務必安裝>" echo "----------------------------------" OPTIONS="安裝 跳過本步" select opt in $OPTIONS;do if [ "$opt" = "安裝" ]; then s3="1" break elif [ "$opt" = "跳過本步" ]; then s3="0" break else echo "錯誤選擇!" fi done proc="4" echo $proc > $procFile echo "==========================================================" fi #4:確認subfonts.pe和Unicode.sfd檔案路徑 if [ "$proc" = "4" ]; then echo "確認subfonts.pe和Unicode.sfd檔案位置" echo "<fontforge產生字型用,務必確認正確,否則未必能自動找到>" echo "-------------------------------------------------" echo "subfonts.pe預設路徑="$subfontsPath echo "Unicode.sfd預設路徑="$UnicodePath OPTIONS="更改 不更改" select opt in $OPTIONS;do if [ "$opt" = "更改" ]; then echo -n "subfonts.pe路徑[直接斷行符號採用預設]=" read filepath if [ ! -z "$filepath" ];then subfontsPath="$filepath" fi echo -n "Unicode.sfd路徑[直接斷行符號採用預設]=" read filepath if [ ! -z "$filepath" ];then UnicodePath="$filepath" fi echo "確認路徑分別為:" echo "subfonts.pe路徑="$subfontsPath echo "Unicode.sfd路徑="$UnicodePath break elif [ "$opt" = "不更改" ]; then break else echo "錯誤選擇!" fi done echo -n "若以上路徑都不可用時,到$findpath搜尋[直接斷行符號採用預設]=" read tmpfindpath if [ ! -z "$tmpfindpath" ];then findpath="$tempfindpath" fi proc="5" echo $proc > $procFile echo "==========================================================" fi #5:設定CJK字型引用名 if [ "$proc" = "5" ]; then echo "設定字型引用名" echo "說明:比如設定simsun.ttc的引用名叫song,在tex檔案中就是這麼引用\begin{CJK*}{GBK}{song}" echo "--------------------------------------" echo "<目錄中存在的檔案清單>" ls echo "分別設定引用名(注意不要出現重名):" fontcount="1" for i in *.ttc *.ttf *.bdf *.dfont *.bin *.hqx *.otf *.sfd *.pfa *.pfb *.cid *.ps *.svg *.pk *.pcf do if [ "${i:0:1}" = "*" ]; then continue; fi echo -n "字型檔"$i"=" read fname mv $i $fontcount"-RENAMEDFONT-"$fname"."${i##*.} let "fontcount=$fontcount+1" done proc="6" echo $proc > $procFile echo "==========================================================" fi #>=6:正式安裝中!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! echo "配置完成,進行正式安裝..." echo "安裝過程將持續很長時間,處理一個字型大約花費幾十分鐘,請確認以上步驟均沒有錯誤,如果有錯誤請先結束指令碼再次運行,確認繼續?" echo "選擇後請耐心等待結束,沒選項了= =|||......" OPTIONS="繼續 退出" select opt in $OPTIONS;do if [ "$opt" = "繼續" ]; then break elif [ "$opt" = "退出" ]; then exit 0 else echo "錯誤選擇!" fi done #6:正式安裝texlive if [ "$proc" = "6" ]; then echo "★正式安裝texlive" installTex $s1 perr $? proc="7" echo $proc > $procFile fi #7:正式安裝CJK if [ "$proc" = "7" ]; then echo "★正式安裝CJK" installCJK $s2 perr $? proc="8" echo $proc > $procFile fi #8:正式安裝fontforge(若有必要,要順便配置PATH) if [ "$proc" = "8" ]; then echo "★正式安裝fontforge" installFontforge $s3 perr $? proc="9" echo $proc > $procFile fi #9:正式檢查subfonts.pe和Unicode.sfd存在性 if [ "$proc" = "9" ]; then echo "★檢查subfonts.pe和Unicode.sfd存在性" if [ -e "$subfontsPath" ]; then echo "subfonts.pe在預設路徑中找到" else echo "subfonts.pe沒找到在"$findpath"中尋找..." subfontsPath=`find $findpath |grep -i "subfonts\.pe"` if [ -z "$subfontsPath" ]; then echo "[致命錯誤]沒找到subfonts.pe" exit 1 else echo "找到檔案:"$subfontsPath fi fi if [ -e "$UnicodePath" ]; then echo "Unicode.sfd在預設路徑中找到" else echo "Unicode.sfd沒找到在"$findpath"中尋找..." UnicodePath=`find $findpath |grep -i "unicode\.sfd"` if [ -z "$subfontsPath" ]; then echo "[致命錯誤]沒找到Unicode.sfd" exit 1 else echo "找到檔案:"$UnicodePath fi fi proc="10" echo $proc > $procFile fi #>=10:迴圈處理字型中 nowproc="9" echo "★漫長的迴圈開始啦~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" #首先構造必要目錄 mkdir -p $mapPath mkdir -p $encPath"$encoding" echo "產生路徑:"$mapPath echo "產生路徑:${encPath}${encoding}" for fontfile in *RENAMEDFONT* do fonttype=${fontfile##*.} tmpname=${fontfile##*-} citename=${tmpname%%.*} count=${fontfile%%-*} let "nowproc=${nowproc}+1" echo "☆當前處理字型為${citename}......" if [ "$proc" -gt "$nowproc" ]; then echo "==>已處理" continue; fi #如果提示找不到fontforge,看安裝成功沒,然後再檢查PATH mapfilename=${citename}".map" if [ ! -e "$mapfilename" ]; then fontforge -script "$subfontsPath" "$fontfile" "$citename" "$UnicodePath" fi makemap $mapfilename mkdir -p $tfmPath"$citename" mkdir -p $typePath"$citename" echo "產生字型路徑:"$tfmPath"$citename" echo "產生字型路徑:"$typePath"$citename" cp $citename".map" $mapPath mv *.tfm $tfmPath"$citename" mv *.pfb $typePath"$citename" #產生fd檔案 echo "\ProvidesFile{c70${citename}.fd}" >>$encPath"$encoding/c70${citename}.fd" echo "\DeclareFontFamily{C70}{${citename}}{\hyphenchar \font\m@ne}" >>$encPath"$encoding/c70${citename}.fd" echo "\DeclareFontShape{C70}{${citename}}{m}{n}{<-> CJK * ${citename}}{}" >>$encPath"$encoding/c70${citename}.fd" echo "\DeclareFontShape{C70}{${citename}}{bx}{n}{<-> CJKb * ${citename}}{\CJKbold}" >>$encPath"$encoding/c70${citename}.fd" echo "\endinput" >>$encPath"$encoding/c70${citename}.fd" #記錄產生的map檔案名稱 echo $mapfilename >> $maprec let "proc=$proc+1" echo $proc > $procFile done #這個需要root許可權 sudo -K echo $password| sudo -S texhash #更新 for i in `cat $maprec` do updmap --enable Map $i done #清理本臨時目錄 if [ "$RMYES" = "1" ]; then rm -r `pwd` fi echo "任務終了= =|||久等了......" |