使用 siunitx 包对二进制单元进行索引

使用 siunitx 包对二进制单元进行索引

按照如何覆盖 siunitx 的二进制前缀,对二进制前缀的任何更改都需要推迟到 \begin{document}。但是,如果我在索引中使用相同的二进制前缀,似乎我需要在序言中重复相同的声明。尝试确定处理此问题的正确方法是什么,而不必重复相同的声明。

要查看问题,请注释掉以下行:

< ---- This needs to be repeated

如果\AtBeginDocument删除声明,则该单位bit不再以红色显示。

笔记:

  • 我对最后一个参数中的数学内容还有其他一些问题\AddIndexEntry,并且非常确定它与“强化”/扩展有关,因此如果从这个例子中可以明显看出,那么我将节省发布更多类似问题的时间。这个特定问题的独特之处在于它siunitx与二进制前缀具体相关。

代码:

\documentclass{article}
\usepackage{imakeidx}
\usepackage{xparse}
\usepackage{siunitx}
\usepackage{xcolor}
\usepackage{hyperref}

\newcommand*\lettergroup[1]{\subsection{#1}}

\newcommand*{\IndexWithName}[2]{%
    % #1 = word to index
    % #2 = index name
    \index[#2]{#1}%
}%

\newcommand*{\FormatIndexEntry}[2]{%
    \textcolor{blue}{#1} #2%
}%


%% Defer the binary units until AFTER \begin{document} as per
%% https://tex.stackexchange.com/questions/287579/how-to-overwrite-siunitxs-binary-prefixes
\sisetup{binary-units=true}%  
\AtBeginDocument{%
    \DeclareSIUnit\bit{\textcolor{red}{bit}}%
}
\DeclareSIUnit\bit{\textcolor{red}{bit}}% < ---- This needs to be repeated

\NewDocumentCommand{\AddIndexEntry}{%
    O{}% #1 = index name
      m% #2 = word to index this under
      m% #3 = indexed term
      m% #4 = symbol
}{%
    \expandafter\IndexWithName\expandafter{%
        #2!\FormatIndexEntry{#3}{#4}%
    }{#1}%
}
\newcommand{\indexopt}[2]{\index[#2]{#1}}

\makeindex[title={Main Index},columns=1,program=texindy]
\makeindex[title={Name Index},columns=1,program=texindy,name=Name]
\indexsetup{level=\section}

\begin{document}
\SI{1}{\bit}
\AddIndexEntry[Name]{Bytes}{Bit}{symbol: $\si{\bit}$}

\clearpage 
\setcounter{secnumdepth}{0}
\printindex[Name]
\end{document}

答案1

像往常一样,这是一个扩展问题;当发生写入时,错误是未定义,除非我们正在处理或,\bit否则它不会定义。\si\SI

我不确定为什么在序言中似乎也需要声明,但是如果你避免扩展索引条目,你会得到更好的设置。

\documentclass{article}
\usepackage{imakeidx}
\usepackage{xparse}
\usepackage{siunitx}
\usepackage{xcolor}
\usepackage{hyperref}

\newcommand*\lettergroup[1]{\subsection{#1}}

\newcommand*{\IndexWithName}[2]{%
    % #1 = word to index
    % #2 = index name
    \index[#2]{#1}%
}

\NewDocumentCommand{\FormatIndexEntry}{mm}{%
    \textcolor{blue}{#1} #2%
}


%% Defer the binary units until AFTER \begin{document} as per
%% http://tex.stackexchange.com/questions/287579/how-to-overwrite-siunitxs-binary-prefixes
\sisetup{binary-units=true}
\AtBeginDocument{%
    \DeclareSIUnit\bit{\textcolor{red}{bit}}%
}

\NewDocumentCommand{\AddIndexEntry}{%
    O{}% #1 = index name
      m% #2 = word to index this under
      m% #3 = indexed term
      m% #4 = symbol
}{%
    \expandafter\IndexWithName\expandafter{%
        #2!#3@\FormatIndexEntry{#3}{\unexpanded{\unexpanded{#4}}}%
    }{#1}%
}
\newcommand{\indexopt}[2]{\index[#2]{#1}}

\makeindex[title={Main Index},columns=1,program=texindy]
\makeindex[title={Name Index},columns=1,program=texindy,name=Name]
\indexsetup{level=\section}

\begin{document}

\SI{1}{\bit}

\AddIndexEntry[Name]{Bytes}{Bit}{symbol: \si{\bit}}

\clearpage 
\setcounter{secnumdepth}{0}
\printindex[Name]
\end{document}

请注意,我使其\FormatIndexEntry更加完善,并添加了内容#3@以便更好地整理条目。

在此处输入图片描述

相关内容