latex中文自動安裝配置指令碼

來源:互聯網
上載者:User

#!/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 "任務終了= =|||久等了......"

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.