![Indexação com unidades binárias usando o pacote siunitx](https://rvso.com/image/327774/Indexa%C3%A7%C3%A3o%20com%20unidades%20bin%C3%A1rias%20usando%20o%20pacote%20siunitx.png)
ConformeComo substituir os prefixos binários do siunitx, quaisquer alterações nos prefixos binários precisam ser adiadas para seremdepois \begin{document}
. No entanto, parece que se estou usando os mesmos prefixos binários no índice, preciso repetir as mesmas declarações no preâmbulo. Tentando determinar qual a forma correta de lidar com esse assunto e não ter que repetir as mesmas declarações.
Para ver o problema comente a linha indicada por
< ---- This needs to be repeated
Se, em vez disso, a \AtBeginDocument
declaração for removida, a unidade bit
não será mais exibida em vermelho.
Notas:
- Tenho vários outros problemas com conteúdo matemático no último parâmetro
\AddIndexEntry
e tenho certeza de que está relacionado à "robustificação"/expansão, portanto, se for óbvio neste exemplo, economizarei tempo postando mais perguntas semelhantes. Esta questão específica é distinta porque está especificamente relacionada asiunitx
prefixos binários.
Código:
\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}
Responder1
Como sempre, é um problema de expansão; quando a gravação acontece, o erro é que \bit
não está definido, o que não acontece, a menos que estejamos processando \si
or \SI
.
Não sei por que a declaração parece precisar ser exigida também no preâmbulo, mas você obterá uma configuração melhor se evitar expandir a entrada do índice.
\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}
Observe que tornei \FormatIndexEntry
robusto e também adicionei #3@
para melhor agrupamento da entrada.