acronym
如果我使用该包定义缩写词,然后使用该缩写词的长格式或短格式而不使用该包的功能,我会收到警告。acronym
例如,在本文档中:
\documentclass{article}
\usepackage{acronym}
\begin{document}
\acrodef{FAQ}{frequently asked question}
Using \ac{FAQ} is fine.
I want to be warned if I use bare ``FAQ'', though.
I also want to be warned if I use ``frequently asked question''.
\end{document}
我想要以下形式的输出:
warning: line 10: "FAQ" used instead of "\ac{FAQ}"
warning: line 11: "frequently asked question" used instead of "\ac{FAQ}"
很高兴能有一个解决方案,它使用 LaTeX 宏、LuaLaTeX Lua 代码或后处理的任何组合。现在我使用两个粗糙的 shell/Perl 单行程序,它们可能不太可靠。
答案1
我已经将此功能添加到texlint
脚本在我的 allmytexs
存储库。
它的工作原理类似于下面的 hacky 脚本,该脚本将 aux 文件中的首字母缩略词转换为在 chktexrc 文件中搜索的模式,然后运行chktex
。
#!/usr/bin/env bash
set -o nounset -o pipefail -o errexit
if [[ $# != 1 || "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
echo usage: "$0" TEXNAME
exit 2
fi
proc_acros () {
sort | uniq | paste -s -d '|' | sed -e 's/ /! /g'
}
texname="$1"
if [[ $texname != *.tex ]]; then
texname="${texname}.tex"
fi
pdfname="${texname%.tex}.pdf"
auxname="${texname%.tex}.aux"
chktexrc=acronym.chktexrc
latexmk "$texname" || true
rm --force "$chktexrc" 2>&1 || true
short_acros="$(perl -ne 'print if s/^\\newacro{([^}]+)}\[([^\]]+)\]{.+}$/\1\n\2/' "$auxname" | proc_acros)"
long_acros="$(perl -ne 'print if s/^\\newacro{[^}]+}\[[^\]]+\]{(.+)}$/\1/' "$auxname" | proc_acros)"
cat >"$chktexrc" <<EOF
WipeArg
{
\acro:{}[]{}
\acrodef:{}[]{}
\acrodefused:{}[]{}
\newacro:{}[]{}
\acroindefinite:{}[]{}
\newacroindefinite:{}[]{}
\acrodefindefinite:{}[]{}
\DeclareSIUnit:{}{}
\ac:[]{} \Ac:[]{} \acp:[]{} \Acp:[]{}
\acf:[]{} \Acf:[]{} \acfp:[]{} \Acfp:[]{}
\acs:[]{} \Acs:[]{} \acsp:[]{} \Acsp:[]{}
\acl:[]{} \Acl:[]{} \aclp:[]{} \Aclp:[]{}
\url:{}
}
UserWarnRegEx
{
(?!#-101:Short! version! of! acronym! found)(?<!!\\\\)(?:$short_acros)
(?!#-102:Long! version! of! acronym! found)(?<!!\\\\)(?:$long_acros)
}
EOF
chktex --localrc "$chktexrc" "$texname" 2>&1 || true
\acrodefused
是一个 LaTeX 命令,我用它来制作从一开始就被视为已定义的首字母缩略词:
\newcommand*{\acrodefused}[2]{\acrodef{#1}{#2}\acused{#1}}