自动引用错误消息

自动引用错误消息

我正在写一本书,其中将包含来自陌生计算机系统的错误消息和代码。我需要做的是:

维护错误消息代码列表:

ABC0000T

对于每个代码,都有一个示例消息文本:

ABC0000T Badgers detected - code 二十

以及一段描述性文字:

如果当前每日 Badger 访问代码不匹配二十,獾访问控制失败,您应该立即呼叫支持人员。

如果代码是99,那么这些都是僵尸獾,你应该逃命。

我认为它的工作方式是这样的:在书的某个地方(可能是附录),所有这些内容都被打印出来,可能是按照消息代码的字母顺序排列的(尽管我可能需要将内容分成两三个部分/组。在书的正文中,我写了一些冗长的内容,例如:

如果獾访问出现任何问题,ABC0000T就会发出消息并且系统停止。

其中消息文本也是指向消息附录的超链接。

问题是:我思考glossaries软件包可能最多只能达到这个水平,但在我开始投入时间之前,您能提供更好的建议吗?

我们诚挚地欢迎对标题和标记(或者实际上任何地方)进行改进。

答案1

这是我的建议,希望对您有用。这是我工作中使用的简化版本,但仍应包含足够的内容来说明其工作原理并帮助您入门。我没有解决环境/命令等的间距问题,因为这不是这个问题的重点。

完整的 MWE 示例在最后(并包含在内MyPreamble.sty),但将首先分部分解释。

  1. 每个错误消息都存储在单独的文件中,可以独立编译。这可以根据所需的灵活性轻松进一步扩展。因此,以下内容将是ABC0000T.tex

    \documentclass{article}
    \usepackage{MyPreamble}
    
    \begin{document}
    \begin{ErrorMessage}
    \BriefMessage{%
       ABC0000T Badgers detected - code xx.
    }
    
    \DetailedMessage{%
      If the current daily badger access code doesn't match xx, badger access control 
      has failed and you should call out support immediately.
    
      If the code is 99, then these are zombie badgers and you should fly for your life.
    }
    \end{ErrorMessage}
    \end{document}
    

    将每条消息保存在单独的文件中将确保每个错误代码都是唯一的,并允许您轻松找到和编辑特定的错误代码。编译上述文件您将获得:

    在此处输入图片描述

  2. 一旦你有了上述文件集,你就可以使用一种\foreach循环来包含所有要生成的文件

    • 附录包含错误代码、简要消息、详细消息
    • 所有错误代码的索引等。

    所提供的 MWE 并未涵盖这一点。

  3. 然后,要访问这些,您可以使用\ExtractBriefMessage{ABC0000T}并生成:

    在此处输入图片描述

    或者\ExtractDetailedMessage{ABC0000T}你得到:

    在此处输入图片描述

警告:

  • 下面的 MWE 将覆盖您运行此程序的目录中的MyPreamble.sty文件。ABC0000T.tex

进一步增强

  • 错误消息可能应该存储在单独的目录中。
  • 不同类型的消息如:、、Info等等。WarningError
  • 允许错误名称与文件名不同。这可以通过向环境提供可选参数来实现ErrorMessage。例如,您可以使用\begin{ErrorMessage}[\textcolor{red}{ABC}\textcolor{blue}{0000}T]

代码

这是完整的 MWE。

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents*}{MyPreamble.sty}
    \usepackage{standalone}
    \usepackage{xcolor}
    \usepackage{mdframed}
    \mdfdefinestyle{MdframedErrorMessageStyle}{%
        skipabove=\baselineskip plus 2pt minus 1pt,%
        skipbelow=\baselineskip plus 2pt minus 1pt,%
        frametitlerule=true,%
        leftmargin=-3pt,%
        rightmargin=-3pt,
        outerlinewidth=1.5pt,%
        roundcorner=3pt,%
        nobreak=true,% do not split across pages
        frametitle={Error Message},%
        frametitlebackgroundcolor=gray!20,%
        backgroundcolor=blue!90!red!5,%
    }%
    \newcommand{\BriefMessage}[1]{%
        \addvspace{\baselineskip}\par\noindent%
        \textbf{Brief Message:} #1%
    }%
    \newcommand{\DetailedMessage}[1]{%
        \addvspace{\baselineskip}\par\noindent%
        \textbf{Detailed Message:} #1%
    }%
    \newenvironment{ErrorMessage}{%
        \begin{mdframed}[%
            style=MdframedErrorMessageStyle,%
            frametitle={Error Message: \jobname}%
            ]%
    }{%
        \end{mdframed}%
    }%

    % If new environemnts/commands to be used within an ErrorMessage
    % they shuld be disabled in this macro.
    \newcommand{\DisableAllErrorMessageMacros}{%
        \let\ErrorMessage\relax%    Disable mdframed environemnt
        \let\endErrorMessage\relax%
        \newenvironment{ErrorMessage}{}{}%
        \renewcommand{\BriefMessage}[1]{}% ignore brief message
        \renewcommand{\DetailedMessage}[1]{}% ignore detailed message
    }%
\end{filecontents*}


\begin{filecontents*}{ABC0000T.tex}
    \documentclass{article}% Each error message is a complete standalone document
    \usepackage{MyPreamble}

    \begin{document}
    \begin{ErrorMessage}
    \BriefMessage{%
        ABC0000T Badgers detected - code xx.
    }

    \DetailedMessage{%
        If the current daily badger access code doesn't match xx, badger access control has failed and you should call out support immediately.

        If the code is 99, then these are zombie badgers and you should fly for your life.
    }
    \end{ErrorMessage}
    \end{document}
\end{filecontents*}

    \usepackage{MyPreamble}
    \newcommand{\ExtractBriefMessage}[1]{% #1 = error message id
        \DisableAllErrorMessageMacros%
        \renewcommand{\BriefMessage}[1]{##1}%
        \input{#1}%
    }%
    \newcommand{\ExtractDetailedMessage}[1]{% #1 = error message id
        \DisableAllErrorMessageMacros%
        \renewcommand{\DetailedMessage}[1]{##1}%
        \input{#1}%
    }%

\begin{document}
The brief message is:
\ExtractBriefMessage{ABC0000T}

\medskip\hrule\medskip

The detailed message is:
\ExtractDetailedMessage{ABC0000T}
\end{document}

相关内容