我正在尝试编写一个 shellscript,它通过 Latex 打印特定目录的树视图及其 pdf 的子目录,以及该主目录中包含的所有脚本的标题和内容。
树视图的工作方式就像一个魅力,但我不知道如何让脚本的打印工作。
到目前为止的代码:
#!/bin/bash
# Script to export directory with pdflatex
# Generate .tex file
# Directory Listing
echo "\documentclass[11pt,a4paper,oneside]{article}" > tmp.tex
echo "\usepackage{fullpage}" >> tmp.tex
echo "\begin{document}" >> tmp.tex
echo "\section{Listing}" >> tmp.tex
echo "\begin{verbatim}" >> tmp.tex
tree $1 >> tmp.tex
echo "\end{verbatim}" >> tmp.tex
echo "\end{document}" >> tmp.tex
# ShellScript printout
???????
# Generate .pdf file
pdflatex tmp.tex
#Cleanup
rm tmp.tex
答案1
漂亮打印目录树和脚本文件内容
编辑:较新的版本,具有完整的目录作为树和图片支持,在第二部分。
\verbatiminput
从包中使用逐字。
像这样:
#!/bin/bash
tempfile=$(mktemp /tmp/dirtree-XXXXX.tex)
trap "rm $tempfile" 0 1 2 3 6 9 15
cat <<EOF >$tempfile
\documentclass[11pt,a4paper,oneside]{article}
\usepackage{fullpage,verbatim,dirtree}
\begin{document}
\section{Listing}
\dirtree{%
EOF
export -a scriptList=()
while IFS=/ read -a fPath ;do
file="${fPath[*]:${#fPath[*]}-1}"
IFS=/
full="${fPath[*]}"
type="$(file -b "$full")"
echo .${#fPath[@]} "${file//_/\\_}\DTcomment{$type}. "
[[ "$type" =~ script.text ]] && scriptList=("${scriptList[@]}" "$full")
done < <(
find $1 -type d -o -type f
) >>$tempfile
export IFS=$'\n\t '
echo "}" >>$tempfile
for file in "${scriptList[@]}";do
name="${file##*/}"
printf "\\section{%s}\n{\\\\scriptsize\\\\verbatiminput{%s}}\n" \
"${name//_/\_}" "${file}" >>"${tempfile}"
done
echo >>"${tempfile}" '\end{document}'
pdflatex -interaction nonstopmode "${tempfile}"
谁会产生这种输出:
漂亮的打印目录树,包含内容表、脚本和图像文件。
注意:用于计算目录,latex
必须运行两次。
虫子:
这个脚本只是一个概念证明,图像类型可能是有限的,可以改进,最终通过帮助图像魔术师,网络PBM或任何图形库...等等
去做:
- 修复图像尺寸
- 改进图像过滤
- 添加对 pdf、ps 以及其他可打印文件的支持,例如 .man、.tex、.sgml、.odf
- 添加打印文档文件第一页的选项。
- 更正确地创建和清除临时文件。
就在那里:
#!/bin/bash
tempfile=$(mktemp /tmp/dirtree-XXXXX.tex)
# trap "rm $tempfile" 0 1 2 3 6 9 15
cat <<EOF >$tempfile
\documentclass[11pt,a4paper,oneside]{article}
\usepackage{fullpage,graphicx,verbatim,dirtree}
\makeatletter
\newcommand{\typePPage}[2]{\DTcomment{{\scriptsize #1
\begin{minipage}[t]{5em}\mbox{}\hfill\ifx\@empty#2\else%
s.$\ref{sec:#2}$, p.$\pageref{sec:#2}$\fi\end{minipage}}}}
\makeatother
\begin{document}\parindent=0pt%
\section{Listing}
\dirtree{%
EOF
export -a scriptList=()
export -A typelist=()
while IFS=/ read -a fPath ;do
file="${fPath[*]:${#fPath[*]}-1}"
IFS=/
full="${fPath[*]}"
type="$(file -b "$full")"
if [[ "$type" =~ script.text ]] || [[ "$type" =~ image ]] ;then
scriptList=("${scriptList[@]}" "$full")
typelist["${full//\//_}"]="$type"
echo .${#fPath[@]} \
"${file//_/\\_}\typePPage{$type}{${file//[\/.+()_-]/}}. "
else
echo .${#fPath[@]} "${file//_/\\_}\typePPage{$type}{}. "
fi
done < <(
find $1 -type d -o -type f
) >>$tempfile
export IFS=$'\n\t '
echo "}" >>$tempfile
for file in "${scriptList[@]}";do
name="${file##*/}"
printf '\\section{%s}\n\\label{sec:%s}\n' \
"${name//_/\_}" "${name//[\/.+()_-]/}"
if [[ "${typelist["${file//\//_}"]}" =~ script.text ]];then
printf '{\\scriptsize\\verbatiminput{%s}}\n' "${file}"
else
printf '\\includegraphics[width=\\textwidth]{%s}\n' "${file}"
fi
done >>"${tempfile}"
echo >>"${tempfile}" '\end{document}'
pdflatex -interaction nonstopmode "${tempfile}" >/dev/null 2>&1
pdflatex -interaction nonstopmode "${tempfile}"
可以产生:
答案2
我不太清楚你想要什么,但据我了解,你希望将所有.sh
文件的输出打印到 tmp.tex 中。然后你可以做类似的事情
find -name "*.sh" -exec cat "{}" + >> tmp.tex
它连接所有.sh
文件,然后将其添加到tmp.tex
.