У меня есть база данных, полная имен, адресов и т. д. Мы используем их на работе, чтобы убедиться, что только люди из базы данных допускаются внутрь (или им запрещен вход, если они когда-либо сделали что-то не так). Я создал документ с помощью pdflatexdb, и с помощью longtable у меня теперь есть «рабочий» документ, с которым я могу жить, если придется.
Однако, поскольку мы добавляем людей в базу данных каждый день, «список» становится больше и менее управляемым, если говорить о сканировании имени или идентификационного номера и т. п. Я хотел бы выяснить, как создать «индекс», который покажет, на каких страницах фамилии (поле в базе данных) начинаются с... IE - имена, начинающиеся с A, находятся на первой странице, B на странице 50, C на странице 60 и т. д. Вот рабочий пример:
\documentclass[10pt,twoside]{report}
\usepackage{longtable}
\usepackage[left=.5in, right=.5in, top=1cm, bottom=.8in]{geometry}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead{}
\fancyfoot{}
\fancyfoot[RE, RO]{\thepage}
\fancyfoot[C]{Generated: \today}
\renewcommand{\headrulewidth}{0pt}
\texdbconnection{CONNECTION STUFF}
%% BEGIN TeXDBdef
\texdbdef{##query}{select lname, fname, license_no, comments from visitors where redsheet='Allow' order by lname}{##lname,##fname,##license,##comments}
%% EHD TeXDBdef
\begin{document}
\begin{center}\section*{These people are allowed inside the building.}\end{center}
\begin{center}\Large{Ordered by name}\end{center}
\begin{longtable}{@{\extracolsep{\fill}}llp{8cm}l}
\Large{Name} & \Large{License \#} & \Large{Comments} \vspace{1em} \\ \hline \vspace{.2em}
\endhead
\vspace{.8em}
\texdbfor{##query}{\texttt{##lname,} \texttt{##fname} & \texttt{##license} & \texttt{\textit{##comments}} \\ \vspace{.5em}}
\end{longtable}
\end{document}
Я относительный нуб в LaTeX
, поэтому, пожалуйста, будьте снисходительны, если в моем документе есть грубые ошибки (я предполагаю, что часть моего кода избыточна или даже бесполезна).
Спасибо.
решение1
Однако запустить код без пакета подключения и чего-либо, к чему можно подключиться, невозможно.
\Large{Ordered by name}
команды размера, например, \Large
не принимают аргумент, поэтому, если вы используете их в такой форме, они {}
не разграничивают аргумент, а создают группу, что в данном случае безвредно, но сбивает с толку, поэтому лучше опустить скобки.
Но я предполагаю, что вы можете заменить
\texttt{##lname,}
к
\labelname{##lname}\texttt{##lname,}
где \labelname
берет первую букву и делает, \label
если она новая, что-то вроде
\def\labelname#1{\xlabelname#1.\relax}
\def\xlabelname#1#2\relax{%
\def\tmp{#1}%
\ifx\tmp\firstletter
\else
\global\let\firstletter\tmp
\label{letter-#1}%
\fi}
то в конце вам просто нужно использовать \pageref
каждую букву по очереди:
\documentclass{article}
\def\labelname#1{\xlabelname#1.\relax}
\def\xlabelname#1#2\relax{%
\def\tmp{#1}%
\ifx\tmp\firstletter
\else
\global\let\firstletter\tmp
\label{letter-#1}%
\fi}
\begin{document}
\labelname{Alan}Alan
\labelname{Brian}Brian
\labelname{David}David
\newpage
\labelname{Duncan}Duncan
\labelname{Fred}Fred
\section{Name index}
\makeatletter
\def\refnameletter#1{%
\expandafter\ifx\csname r@letter-#1\endcsname\relax\else
\par\noindent#1: \pageref{letter-#1}\par
\fi
\if Z#1\else\expandafter\refnameletter\fi}
\refnameletter ABCDEFGHIJKLMNOPQRSTUVWXYZ
\end{document}