diff options
Diffstat (limited to 'macros/latex/contrib/dvisirule/dvisirule.sh')
-rw-r--r-- | macros/latex/contrib/dvisirule/dvisirule.sh | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/macros/latex/contrib/dvisirule/dvisirule.sh b/macros/latex/contrib/dvisirule/dvisirule.sh new file mode 100644 index 0000000000..20969abf8f --- /dev/null +++ b/macros/latex/contrib/dvisirule/dvisirule.sh @@ -0,0 +1,179 @@ +#!/bin/sh +# +# Copyright (C) 2012-2022 Jiro Senju +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# any later version. +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this package. If not, see <http://www.gnu.org/licenses/>. +# + +# Superimpose the hidden or covered `\hline` and `\vline` in a LaTeX +# tabular / colortbl environment. + +set -eu + +usage() +{ + cat <<- EOF + $(basename $0) [option] in.dvi [out.dvi] + option: + -j jobs + number of jobs in parallel. + a job means handling the extracted page. + default: the number of processors online + -t dvitype-cmd + 'dvitype' command. + default: dvitype or \$DIVTYPE + -c dviconcat-cmd + 'dviconcat' command. + default: dviconcat or \$DIVCONCAT + -s dviselect-cmd + 'dviselect' command. + default: dviselect or \$DIVSELECT + -l library-dir + library path where dvisirule-bin, \*.awk and \*.mk + are located. + default: a dir kpsewhich(1) returned. + if you set "library-dir" by this option, then + "kpsewhich -path \"library-dir\"" is used. + Also this command creates a temporary directory under \$TMPDIR + or /tmp. For details, refer to dvisirule.pdf. + EOF +} + +jobs=0 +dvitype=${DVITYPE:-dvitype} +dviconcat=${DVICONCAT:-dviconcat} +dviselect=${DVISELECT:-dviselect} +libdir="" +# posix compliant builtin +while getopts j:t:c:s:l:h i +do + case $i in + j) + { + test "$2" -eq $(($2 + 0)) + test "$2" -ge 1 + } || { + echo Bad arg "$2" 1>&2 + exit 1 + } + jobs="$2" + shift + ;; + t) dvitype="$2" + shift + ;; + c) dviconcat="$2" + shift + ;; + l) libdir="-path \"$2\"" + shift + ;; + h) usage + exit 0 + ;; + *) usage 1>&2 + exit 1 + ;; + esac + shift +done +shift $(($OPTIND - 1)) + +find_lib() # file +{ + eval kpsewhich $libdir $1 || + kpsewhich $1 +} + +pgnum="$(find_lib dvisirule-pgnum.awk)" +expg="$(find_lib dvisirule-expg.mk)" +marker="$(find_lib dvisirule-marker.awk)" +sirule="$(find_lib dvisirule-bin)" + +# find the input file +f=$(realpath "$1") +d=$(dirname "$f") +b=$(basename "$f" .dvi) +tables="$d/$b.sirule" +test -e "$tables" || +{ + echo No "$tables" 1>&2 + exit 1 +} +# no need to handle it +test -s "$tables" || exit 0 + +# decide the output file +out="$d/$b-si.dvi" +test $# -eq 2 && +out=$(realpath -m "$2") +test $# -ge 3 && +{ + echo Bad arg 1>&2 + exit 1 +} + +d="${TMPDIR:-/tmp}" +test -d "$d" || +{ + echo "$d" is not a directory 1>&2 + exit 1 +} +tmp="$d/$(basename $0).$$" +mkdir "$tmp" +cd "$tmp" + +# parallel processing per page +test $jobs -eq 0 && +jobs=$(getconf _NPROCESSORS_ONLN) +# set +eu +# if [ "$MAKEFLAGS" ] +# then +# echo "$MAKEFLAGS" | fgrep -q -- -j +# if [ $? -eq 1 ] +# then +# MAKEFLAGS="$MAKEFLAGS -j$jobs" +# fi +# else +# MAKEFLAGS="-j$jobs" +# fi +# export MAKEFLAGS +# set -eu + +# which pages to handle? +npages=$("$dvitype" -max-pages=1 "$f" | + fgrep totalpages= | + sed -e 's/^.*totalpages=//') +uniq "$tables" | +awk -v npages=$npages -f "$pgnum" | +tee tables2 | +xargs -r make -s -j$jobs -f "$expg" \ + DVITYPE="$dvitype" \ + Input="$f" \ + Marker="$marker" \ + SIRULE="$sirule" \ + DVISELECT="$dviselect" + +# concatenate all pages +err=0 +"$dviconcat" -o "$out" $(cat tables2) 2> err || +err=$? +test $err -ne 0 && +grep -vx 'Wrote [0-9]* pages, [0-9]* bytes' err +#test $err -eq 0 # debugging + +cd $OLDPWD +rm -fr "$tmp" + +exit $err |