СогласноКак перезаписать двоичные префиксы 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@
для лучшего сопоставления.