#!/bin/sh # _ _ _ _ # | |_(_) | __ ___| |_ ___ _____ ____ _ # | __| | |/ /|_ / __/ _ \/ __\ \ / / _` | # | |_| | < / /| || (_) \__ \\ V / (_| | # \__|_|_|\_\/___|\__\___/|___/ \_/ \__, | # |___/ # 2021 (C) Pablo # Free use of this software is granted under the terms of the GPL-3.0 License puts() { printf "\033[1m\033[38;5;%sm[%s]\033[m %s\n" "$3" "$1" "$2" } error() { puts "ERROR" "$1" "9" if [ -n "$2" ] then exit "$2" else exit 1 fi } message() { puts "TIKZTOSVG" "$1" "2" } showHelp() { man tikztosvg exit 0 } showVersion() { echo 0.1.2 exit 0 } # The default list of packages and libraries that should be imported PACKAGES="tikz tikz-cd pgfplots amsmath amssymb" LIBRARIES="" if ! [ -x "$(command -v xelatex)" ] then error "xelatex could not be found" fi if ! [ -x "$(command -v pdf2svg)" ] then error "pdf2svg could not be found" fi # Parsing the arguments while [ $# -gt 1 ] do case "$1" in -h|--help) showHelp ;; -v|--version) showVersion ;; -p|--package) case "$2" in "") error "Unnexpected EOF" ;; # Check if the name of the package is valid *" "*) error "Invalid package name. LaTeX package names cannot contain scapes!" ;; *) PACKAGES="$PACKAGES $2" shift shift esac ;; -l|--library) case "$2" in "") error "Unnexpected EOF" ;; # Check if the name of the package is valid *" "*) error "Invalid library name. TikZ library names cannot contain scapes!" ;; *) LIBRARIES="$LIBRARIES $2" shift shift esac ;; -o|--output) if [ -n "$OUTPUT" ] then error "The output path was specified multiple times" elif [ -z "$2" ] then error "Unexpected EOF" else OUTPUT="$2" shift shift fi ;; -q|--quit) QUIET=1 shift ;; *) error "Unexpected token: \"$1\"" ;; esac done case "$1" in -h|--help) showHelp ;; -v|--version) showVersion ;; "") error "No input path provided" ;; "-") INPUT=/dev/stdin ;; *) INPUT="$1" ;; esac case "$OUTPUT" in # Set the output to stdout -) QUIET=1 OUTPUT=/dev/stdout ;; # If no output path is provided, use the basename of the input "") if [ -x "$(command -v dirname)" ] then OUTPUT="$(dirname "$INPUT")/$(basename "$INPUT" | cut -d "." -f1).svg" fi ;; # If the output path is provided, but it resolves to directory, output a # a file with the same basename as the input in the target directory */) OUTPUT="$OUTPUT$(basename "$INPUT" | cut -d "." -f1).svg" ;; esac TEMP_DIR="$(mktemp -d)" TEX_FILE="$TEMP_DIR/tmp.tex" # Generate the LaTeX document printf "\documentclass[crop,tikz,multi=false]{standalone}\n" > "$TEX_FILE" for PACKAGE in $(echo "$PACKAGES" | tr " " "\n" | sort | uniq) do printf "\usepackage{%s}\n" "$PACKAGE" >> "$TEX_FILE" done for LIBRARY in $(echo "$LIBRARIES" | tr " " "\n" | sort | uniq) do printf "\usetikzlibrary{%s}\n" "$LIBRARY" >> "$TEX_FILE" done printf "\\\begin{document}\n" >> "$TEX_FILE" cat "$INPUT" >> "$TEX_FILE" if [ $? -ne 0 ] then rm "$TEMP_DIR" -r error "File not found: $INPUT" fi printf "\\\end{document}\n" >> "$TEX_FILE" if [ -z "$QUIET" ] then message "Rendering the LaTeX document. . ." xelatex -halt-on-error -output-directory="$TEMP_DIR" "$TEX_FILE" else xelatex -halt-on-error -output-directory="$TEMP_DIR" "$TEX_FILE" 1> /dev/null 2>&1 fi S=$? if [ $S -ne 0 ] then rm "$TEMP_DIR" -r if [ -z "$QUIET" ] then error "xelatex exited with code $S" $S else exit $S fi fi if [ -z "$QUIET" ] then message "Converting the output to SVG. . ." fi pdf2svg "$TEMP_DIR/tmp.pdf" "$OUTPUT" 1 S=$? if [ $S -ne 0 ] then rm "$TEMP_DIR" -r if [ -z "$QUIET" ] then error "pdf2svg exited with code $S" $S else exit $S fi fi if [ -z "$QUIET" ] then message "Done!" fi rm "$TEMP_DIR" -rf