当我无法使用首字母缩略词包时自动发出警告

当我无法使用首字母缩略词包时自动发出警告

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}}

相关内容