summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/chemsec/chemsec.dtx
blob: 8f8c8777a6a76eb3eaa32e4b679da0fb7f372465 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
% \iffalse meta-comment
%
% Copyright (C) 2018 by Justin Finnerty <jfinn24985@gmail.com>
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3 of this license
% or (at your option) any later version.  The latest version of this
% license is in:
%
%    http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of LaTeX version
% 2005/12/01 or later.
%
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{chemsec.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[1994/06/01]
%<package>\ProvidesPackage{chemsec}
%<*package>
    [2018/02/01 v1.12 .dtx chemsec file]
%</package>
%<package>\RequirePackage{ifthen}[1994/06/01]
%<*driver>
\documentclass{ltxdoc}
\usepackage{chemsec}[2018/02/01]
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
  \DocInput{chemsec.dtx}
  \PrintChanges
  \PrintIndex
\end{document}
%</driver>
% \fi
%
% \CheckSum{418}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%
% \changes{v1.0}{1996/06/05}{Initial version}
%
% \GetFileInfo{chemsec.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment}
% 
%
% \title{The \textsf{chemsec} package\thanks{This document
%   corresponds to \textsf{chemsec}~\fileversion, dated \filedate.}}
% \author{Justin Finnerty \\ \textsf{jfinn24985@gmail.com}}
%
% \maketitle
%
% \section{Abstract}
% 
% A cross-reference system designed for an arbitrary set of items.
% Generates a document-order set of consecutive number labels that can
% be cross-referenced anywhere in the document. The motivating example
% is labeling chemical structures in a scientific document.
%
% \section{Usage}
%
% This package solves the problem of providing a sequence of numeric
% labels to represent entities in a document. The motivating example is
% labels for chemical structures in a scientific document. In such a
% document you want the full chemical name and a label to appear in the
% typeset document for each chemical structure the first time the
% structure is referenced in the document text. Subsequent references to
% the structure should only use the label.  These labels should form a
% numeric sequence, with the first chemical structure being labeled
% \textbf{1}, the second \textbf{2} and so on.
%
% These labels share similar features to numeric bibliographic reference
% styles, both use numbers to represent something, the numbers form a
% single sequence starting from one and incrementing as references or
% structures appear in the document. Furthermore these labels or
% citations can appear in multiple places in the text but must retain a
% single unique numeric label.
%
% However there are a couple of differences to a bibliography. Firstly
% the name of the chemical structure generally appears where it is first
% used in the document along with its label rather than in a
% bibliography or footnote. Secondly it is common to use a single
% numeric label for closely related structures, appending a sub-label to
% denote individual structures, usually lower-case letters.  For example
% we might have ``\textsf{methyl acetate (\textbf{1a})}'' and
% ``\textsf{ethyl acetate (\textbf{1b})}'' being specific examples of an
% ``\textsf{acetic acid ester (\textbf{1})}'' structure. Lastly, you may
% need to separate the logical and actual first occurrence of a label,
% allowing use of labels in abstracts and captions before a defining
% macro call that sets the actual number of the label in the main
% document sequence.
%
% The solution presented here uses keys to identify structures, in a
% similar way to the BibTeX, with a special format that allows
% associating related structures to an exemplar structure. This is
% achieved by using keys that contain an exclamation mark
% (|main-key!sub-key|) to separate the key for an exemplar structure
% from a sub-key for the related structures. Following our example above
% we might have keys |acetate!methyl|, |acetate!ethyl| and |acetate| as
% the keys for ``methyl acetate'', ``ethyl acetate'' and ``acetic acid
% ester'' respectively.  Using such keys with this package would
% automatically give the labels ``\textsf{\textbf{1a}}'',
% ``\textsf{\textbf{1b}}'' and ``\textsf{\textbf{1}}''.  Alternatively
% in chemistry we want the sub-labels to be more meaningful, for example
% denoting isomeric structures or an abbreviation for different
% substituents. This package allows you to manually provide such a more
% meaningful sub-label for each sub-key, for example leading to
% ``\textsf{methyl acetate (\textbf{1-Me})}'' and ``\textsf{ethyl
% acetate (\textbf{1-Et})}'' and ``\textsf{acetic acid ester
% (\textbf{1})}'' in the output document.

% However, using sub-keys is entirely optional and you can write a
% complete document without using the sub-key feature. Keys with
% sub-keys can be freely mixed in a document with keys that do not have
% sub-keys. We suggest you generally want to provide an exemplar key
% without sub-key for each set of keys which have sub-keys. This allows
% you to refer in the document to the group of related chemicals as well
% as the specific structures, ``\textsf{acetic acid ester
% (\textbf{1})}'' in our example above. Hopefully the most difficult
% part of using the \textsf{chemsec} package is choosing keys for your
% structures.
%
% \subsection{Known Issues}
%
% \subsection{Capitalization of  names}
% 
% The package cannot capitalize the name of an entity, for example if an
% entity name appears at the beginning of a sentence. For example the
% capitalization of a chemical name requires parsing and understanding
% the complete chemical nomenclature, something well beyond the scope of
% this package. It is also hard to automatically detect when
% capitalization should occur. Currently, the solutions are to avoid
% using the macros that might produce entity names at the start of a
% sentence or to manually type the entity name and use a macro that only
% outputs a label. A possible future extension of this package may allow
% the specification of two names for a compound, one capitalized and one
% not, as well as macros to select between them.
% 
% \subsubsection{Failure to issue warning}
%
% \emph{Note} that any labeling issue arising from this package is
% always resolved when the document is processed twice in a row. It is
% therefore recommended that, after making an edit, the user always
% processes the document twice to ensure correct labeling.
%
% The user should get a warning if the for some reason the labels
% typeset in the document are incorrect and the document processing
% needs to be repeated.  This can happen when using a macro that
% requests the value of a label but does not set it.  These macros use
% current values or values set in the \textsl{aux} file. If the values
% from the \textsl{aux} file need to be used they may either not be present
% or differ from values set later in the document.  When this happens
% the user should get a warning message, however a number of issues may
% prevent this and it is always recommended to process the document twice
% after editing to ensure the correct labeling.
%
% Known cases of failure to get a warning message are:
% \begin{itemize}
% \item Use of macros before the document begins, for example in the
%   \textsf{abstract} environment, may fail to issue a warning about
%   incorrect labels. (I think this is due to the boolean variable that
%   signals an error being reset at the beginning of the document.)
% \item Automatic sub-labels. Currently we cannot check to see if
%   sub-labels change during document processing. This is because
%   sub-labels are stored as text rather than numbers and text comparison
%   is surprisingly difficult in LaTeX.
% \item User-defined sub-labels. We do not detect if a user-defined
%   sub-label is defined after a request for the sub-label.  This is only
%   an issue the first time a document is processed or when a
%   |\DefineChemical| macro command is added to the document.
% \end{itemize}
%
% \subsection{Defining structure names and sub-labels}
%
% \DescribeMacro{\DefineChemical} You define the names and optional
% sub-label of a compound or entity using the |\DefineChemical|
% \marg{key} \marg{name} \marg{sub-label} macro.  This command does not
% display any output in the document nor does it define the first part
% of the label.  This means you can define all the chemicals used in the
% document in a single place rather than as they appear in the document.
% The list can even be placed in a separate file included in the main
% file, facilitating the reuse of keys and names in other documents. No
% matter where this macro is placed in the document the \textsf{chemsec}
% package will use the information wherever needed.
%
% Leaving the \marg{sub-label} argument empty for a |main!sub| key turns
% on automatic sub-labeling for this key. By default this generates
% sequential alphabetic labels for each |sub| key with the same |main|
% key for which there is no user defined sub-label. This means that you
% can manually supply labels for some |main!sub| keys and also have
% |main!sub| keys without a defined label.  This is advanced usage and
% this package does not check to see if the automatically generated
% labels match any of the user-defined labels.
%
% The \textsl{name} parameter can contain many LaTeX formatting
% commands, including the use of |$$| math-mode.
%
% \subsection{\textsf{ChemCite} Macros}
%
% The package provides a range of macros that tailor what information
% about a structure is output into the typeset document. These are the
% |ChemCite| family of macros. All of these macros can have a ``|*|''
% (star) suffix. This suffix indicates this use of the macro should act
% as a cross-reference for the label and not as a possible defining
% reference. This means that the star form can be used in abstracts,
% captions and anywhere in the document you need to use a label where it
% might appear before it appears in the main document text where you
% want the numeric label to be defined.
%   
% \DescribeMacro{\ChemCite\marg{key}} Output the label for the given
% key.  If this is the first time the key is used and the non-star form
% is used the full name precedes the label, with a star no full name is used. For example
% |\ChemCite{acetate!methyl}| could give ``methyl acetate (\textbf{1a})''
% the first time it appeared and ``\textbf{1a}'' elsewhere.
% The non-star form also sets the value of the numeric label at the
% point it first appears in the document. The star form uses in order;
% the current label if defined or a value stored in the \textsl{aux}
% file from the previous time the document was processed or a
% dummy value. The star form also never outputs the full name. For example
% |\ChemCite*{acetate!methyl}| could give ``\textbf{1a}'' if it can
% determine the labels or output a dummy value ``\textbf{0??}'' (or
% less likely ``\textbf{0a}'' or  ``\textbf{1??}'').
% 
% \DescribeMacro{\ChemFCite\marg{key}} This macro always displays the
% structure name as well as the label for the given key. The |F| is a
% mnemonic for \textsf{full}, indicating the full entry of the name and
% label is always used. For example |\ChemFCite{acetate!methyl}| would
% give ``methyl acetate (\textbf{1a})'' the first time it appeared as well
% as elsewhere. The non-star form also
% sets the value of the numeric label at the point it first appears in
% the document. The star form uses in order; the current label if
% defined or a value stored in the \textsl{aux} file from the previous
% time the document was processed or a dummy value. For example
% |\ChemFCite*{acetate!methyl}| could give ``methyl acetate
% (\textbf{1a})'' if it can determine the labels or output a dummy value
% ``?? (\textbf{0??})'' or similar.
% 
% \DescribeMacro{\ChemSCite\marg{key}} In counterpoint to the
% |\ChemFCite| macro, this always only outputs the label for the given
% key.  The |S| is a mnemonic for \textsf{short}, indicating the short
% entry of just the label is always used. For example
% |\ChemSCite{acetate!methyl}| would give ``\textbf{1a}'' the first time
% it appeared as well as ``\textbf{1a}'' elsewhere. The non-star form
% also sets the value of the numeric label at the point it first appears
% in the document. The star form uses in order; the current label if
% defined or a value stored in the \textsl{aux} file from the previous
% time the document was processed or a dummy value. For example
% |\ChemSCite*{acetate!methyl}| could give ``\textbf{1a}'' if it can
% determine the labels or output a dummy value ``\textbf{0??}'' (or less
% likely ``\textbf{0a}'' or ``\textbf{1??}'').
% 
% \DescribeMacro{\ChemMFCite\marg{key}} This macro always displays the
% structure name of the main part of the key with the label for the
% given key.  The |MF| is a mnemonic for \textsf{main full} or
% \textsf{mixed full}, indicating the full entry of the \textit{main}
% (exemplar) name is used with the label and sub-label for the key.  For
% example |\ChemMFCite{acetate!methyl}| would give ``acetic acid ester
% (\textbf{1a})'' wherever it was used. The non-star form also sets the
% value of the numeric label at the point it first appears in the
% document. The star form uses in order; the current label if defined or
% a value stored in the \textsl{aux} file from the previous time the
% document was processed or a dummy value. For example
% |\ChemMFCite*{acetate!methyl}| could give ``acetic acid ester
% (\textbf{1a})'' if it can determine the labels or output a dummy value
% ``?? (\textbf{0??})'' or similar.
% 
% \DescribeMacro{\ChemMSCite\marg{key}} This macro always displays just
% the label from the main part of the key.  The |MS| is a mnemonic for
% \textsf{main short} or \textsf{mixed short}, indicating the short
% entry of just the \textit{main} (exemplar) label for the key.  For
% example |\ChemMSCite{acetate!methyl}| would give ``\textbf{1}''
% wherever it was used.  While this macro always gives exactly the same
% result as |\ChemSCite| with just the main part of a key
% (e.g. |\ChemSCite{acetate}|), it is included here because it allows
% the document writer to include more context in the document as it is
% being written. The non-star form also sets the value of the numeric
% label at the point it first appears in the document. The star form
% uses in order; the current label if defined or a value stored in the
% \textsl{aux} file from the previous time the document was processed or
% a dummy value. For example |\ChemMSCite*{acetate!methyl}| could give
% ``\textbf{1}'' if it can determine the label or output a dummy value
% ``\textbf{0}''.
% 
% \DescribeMacro{\NoCite\marg{key}} This macro outputs nothing in the
% document but sets the numeric value of the label for the key in the
% document ordered sequence.
%
% \subsection{Possible Future extensions}
% 
% \DescribeMacro{\ChemEntityTable} Output a table of entity names,
% labels and keys.  This is intended to be used for creating a useful
% reference table when creating and editing a document rather than for
% final output.
% 
% \subsection{Internal macros that control style}
%
% Style macros can be overridden by the user to control the style of the
% label and accompanying text.
% 
% \DescribeMacro{\ChemLabelStyle} Internal macro that formats a
% label. It is used by the other two style macros for this purpose.
% Users may redefine this macro to change the label formatting.
%
% \DescribeMacro{\ChemFullLabelStyle} Internal macro used to format a
% label and its full name text.  Users may redefine this macro to change
% the name and label formatting, particularly when you wish to format
% the label and sub-label separately.
% 
% \DescribeMacro{\ChemShortLabelStyle} Internal macro used to formats a
% label without name text. Users may redefine this macro to change the
% name and label formatting, particularly when you wish to format the
% label and sub-label separately.
% 
% \DescribeMacro{\ChemMainCounterStyle} Internal macro that converts the
% counter used for main key label into a number or letter. The default
% implementation uses |\arabic| to generate a number. Users may redefine
% this macro to output letters instead of numbers.
%
% \DescribeMacro{\ChemSubCounterStyle} Converts the counter used for the
% sub-key label into a number or letter. The default implementation uses
% |\alph| to generate a letter. Users may redefine this macro to output
% numbers instead of letters.
% 
% \section{Design brief}
% 
% This section contains a description of what this package sets out to
% achieve.  
% The package should be able to consistently label an entity throughout
% the document based on a user-defined key. The label can be either a
% consecutive number or a user-defined label. These labels can be
% combined with a sub-label, which can also be consecutive or
% user-defined.
% 
% When sub-labels are used a user-supplied key and sub-key are
% required. Any entity associated with the key without a sub-key is
% considered to be a generic entity for any entities defined with the
% same key and a sub-key. 
% 
% \subsection{Limits}
% 
% \begin{itemize}
% \item The package can provide consecutive labels or user-defined
%   labels but not both.
% 
% \item Unless user-defined labels are used, consecutive labels are
%   numeric for labels and alphabetic for sub-labels.
% 
% \item The package can provide only a single set of consecutive labels.
% 
% \item The package can provide consecutive sub-labels or user-defined
%   sub-labels but not both for each label.
% \end{itemize}
% 
% \subsection{Actions}
% 
% \begin{itemize}
% \item The first time the |\ChemCite| macros appear in the latex document
%   with a given key is where the consecutive number label for the key
%   is defined (unless user-defined label are being used).
% 
% \item Using macros |\ChemCite*| provides the label without defining the
%   consecutive number label. This allows the label to appear, for
%   example in a table, abstract or figure, before the desired defining
%   location of the label.
% 
% \item The names of entities can be defined anywhere in the document
%   and appear in a user-controlled manner.
% 
% \item The basic macros typeset the entity name and label at the first
%   defining reference position and only the label in other places.
% 
% \item A range of advanced macros allow greater control over the
%   display of the entity name and label.  For example the user can
%   output a label and sub-label but use the name of the generic entity.
%   A chemistry example of this with ``ethyl acetate (1b)'' and its
%   generic entity ``acetic acid ester (1)'' appearing as ``\dots{}gives
%   the second acetic acid ester (1b)\dots{}''.
% 
% \item The label will be typeset in a particular, user configurable,
%   style. The label should be consistently formatted, even in
%   math-mode.
% 
% \item The label can be used transparently by other packages. For
%   example it can be used with the \textsf{psfrag} package to inject
%   the correct labels into figures at documentation preparation time
%   rather than having to recreate new figures whenever the label
%   numbering changes.
% 
% \end{itemize}
% 
% \section{Package options}
% 
% The package has two options.  Both options are intended to be used
% when debugging the package or its usage.  Control of the style used
% when typesetting names and labels is optionally done manually by
% redefining the style control macros described elsewhere.
%
%   \begin{description}
%   \item[|draft|] Output structure/entity key as a superscript before
%     any name and/or label output. This can be useful during document
%     preparation.
%   \item[|debug|] Output extra information in the processing log to do
%   with the operation of the package and turn on |draft| mode.
%   \end{description}
%
% \section{Implementation}
% 
% The package creates a virtual mapping of keys to a name and a
% label. The key is stored as |Main!Sub| if the key has a sub-key. This
% mapping is stored into the \textsf{aux} file where it is read at the
% start of each document processing.  If the mapping is altered during
% processing the user gets a warning to reprocess the document, similar
% to other automatically created indices.
% 
% The package has several sets of macros. The public macros are used to
% define the key to name mapping and to lookup and output the names and
% labels based on the key during document processing.  One set of
% internal macros defines the style used to display the name and
% labels. These macros can be redefined by the user. A second set of
% internal macros controls the definition and management of the map
% data. A third set controls logging information and extra output that
% might be used during testing.
%
% This uses a simple first cited first numbered algorithm to generate a
% unique sequential label for a set of compounds. It relies on a set of
% chemical definitions that can appear anywhere in the text and are
% stored in the ``aux'' file at program termination and read in at
% program start up.
%
% Note on programming style. All the functions are declared using LaTeX
% commands unless using TeX functions |edef|, |gdef| and |xdef| were
% required. The public functions have been defined using LaTeX2e's
% |DeclareRobustCommand*{}|.
%
% \StopEventually{}
%
% \subsection{Output Style Macros}
%
% \begin{macro}{\ChemLabelStyle} \marg{label} The default implementation
%   formats the label in a sloping bold font.
%    \begin{macrocode}
\DeclareRobustCommand*{\ChemLabelStyle}[1]{%
  \textsl{\bfseries{}#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ChemFullLabelStyle}
%   \marg{full name} \marg{main label} \marg{sub-label} Formats the full
%   entity name and label. The default implementation does not format
%   the entity name, simply forwarding the argument as-is. The default
%   implementation appends the sub-key label to the main label and uses
%   the |\ChemLabelStyle| to format them together.
%    \begin{macrocode}
\DeclareRobustCommand*{\ChemFullLabelStyle}[3]{%
  \ifthenelse{\equal{}{#3}}{%
    #1 (\ChemLabelStyle{#2})%
  }{%
    #1 (\ChemLabelStyle{#2#3})%
  }%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ChemShortLabelStyle}
%   \marg{main label} \marg{sub-label} Formats the labels when they
%   appear without the entity name. The default implementation appends
%   the sub-key label to the main label and uses the |\ChemLabelStyle|
%   to format them together.
%    \begin{macrocode}
\DeclareRobustCommand*{\ChemShortLabelStyle}[2]{%
  \ifthenelse{\equal{}{#2}}{%
    \ChemLabelStyle{#1}%
  }{%
    \ChemLabelStyle{#1#2}%
  }%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ChemMainCounterStyle}\marg{counter}
%   Converts the counter used for the main key label into a number or
%   letter. The default implementation uses |\arabic| to generate a
%   number.
%    \begin{macrocode}
\DeclareRobustCommand*{\ChemMainCounterStyle}[1]{%
  \arabic{#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ChemSubCounterStyle}\marg{counter}
%   Converts the counter used for the sub-key label into a number or
%   letter. The default implementation uses |\alph| to generate a
%   letter.
%    \begin{macrocode}
\DeclareRobustCommand*{\ChemSubCounterStyle}[1]{%
  \alph{#1}}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Macros for Debugging and Draft Output}
%
% Several macros are defined to implement the |draft| and |debug|
% package options.  When these options are not used these macros fall
% back on default implementations that mostly do nothing.  These macros
% are redefined when the options are used.
%
%  \begin{macro}{\CN@DEBUG}
%    Internal macro used to suppress debugging messages when not
%    debugging.  This is redefined if the |debug| package option is used
%    to output debugging messages in the processing log.
%    \begin{macrocode}
\makeatletter
\gdef\CN@DEBUG #1#2{}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\CN@WARN}
%   Internal macro used to output errors and warnings as information
%   messages when not debugging. This is redefined if the |debug| option
%   is used to promote these messages to warning messages in the
%   processing log.
%    \begin{macrocode}
\gdef\CN@WARN #1#2{\PackageInfo{#1}{#2}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\CN@DRAFT}
%   Internal macro used to suppress draft only output when not in draft
%   mode. This is redefined if the |debug| or |draft| option is used to
%   add superscript text in the output document.
%    \begin{macrocode}
\gdef\CN@DRAFT #1{}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Options for Debugging and Draft Output}
%
% The package has several options to help with using the package.
%
% \begin{itemize}
% \item The \textsf{debug} option generates more error and warning
%   messages as well as outputting draft data. It does this by redefining
%   the |\CN@DEBUG|, |\CN@WARN| and |\CN@DRAFT| macros.
%    \begin{macrocode}
\DeclareOption{debug}{%
  \gdef\CN@DEBUG #1#2{\PackageInfo{#1}{#2}}%
  \gdef\CN@WARN #1#2{\PackageWarning{#1}{#2}}%
  \gdef\CN@DRAFT #1{$^{[#1]}$}%
}
%    \end{macrocode}
% \item The \textsf{draft} option outputs some draft data. It does this
%   by redefining the |\CN@DRAFT| macro.
%    \begin{macrocode}
\DeclareOption{draft}{%
  \gdef\CN@DRAFT #1{$^{[#1]}$}%
} \ProcessOptions
%    \end{macrocode}
% \end{itemize}
%
% \subsection{Counters}
%
% Several counters are used internally for generating the label
% values. They should not be manually altered by the user.
%  
% \begin{itemize}
% \item |CN@MaxLabelIndex| tracks the maximum label index.
%    \begin{macrocode}
\newcounter{CN@MaxLabelIndex}
\setcounter{CN@MaxLabelIndex}{0}
%    \end{macrocode}
% \item |CN@LabelIndex| is the number of the current label.
%    \begin{macrocode}
\newcounter{CN@LabelIndex}
%    \end{macrocode}
% \item |CN@SubLabelIndex| is the number of the current sub-key label
%    \begin{macrocode}
\newcounter{CN@SubLabelIndex}
%    \end{macrocode}
% \end{itemize}
%
% \subsection{Internal Variables}
%
% \begin{itemize}
% \item |\CN@@label| is a dummy value used when no label is found for a
%   particular key. This is a guard value for erroneous usage.
%    \begin{macrocode}
\expandafter\def\csname CN@@label\endcsname{999}
%    \end{macrocode}
% \item |\CN@@name| is a dummy name used when no name is found for a
%   particular key. This is a guard value for erroneous usage.
%    \begin{macrocode}
\expandafter\def\csname CN@@name\endcsname{X}
%    \end{macrocode}
% \item |\CN@@sublabel| is a dummy sub-label used when no label is found
%   for a particular key/sub-key. This is a guard value for erroneous
%   usage.
%    \begin{macrocode}
\expandafter\def\csname CN@@sublabel\endcsname{X}
%    \end{macrocode}
% \item |CN@KeyFound| is a boolean to signal whether the key was found
%   in the key list. Failure to be found indicates that this is the first
%   time this key was cited.
%    \begin{macrocode}
\newboolean{CN@KeyFound}
%    \end{macrocode}
% \item |CN@ScanList| is a boolean to signal whether the key was found
%   in the last loop of the map scan.
%    \begin{macrocode}
\newboolean{CN@ScanList}
%    \end{macrocode}
% \item |CN@Star| is a boolean that signals that a macro was called
%   using the star form of the command. This alters |CN@getLabel| and
%   |CN@getSubLabel| to use predefined labels (if any) instead of labels
%   defined in the regular document flow.
%    \begin{macrocode}
\newboolean{CN@Star}
\setboolean{CN@Star}{false}
%    \end{macrocode}
% \item |CN@Warning| is a boolean that signals that the document has
%   possible incorrect labels and needs to be reprocessed. This is
%   similar to other places where LaTeX generates warnings
%   for automatically generated labels.
%    \begin{macrocode}
\newboolean{CN@Warning}
\setboolean{CN@Warning}{false}
\AtEndDocument{%
  \ifthenelse{\boolean{CN@Warning}}{%
    \PackageWarningNoLine{chemsec}{Chemsec-label(s) were used before they were
      defined or were never defined.  Rerun to get chemsec-labels right. If 
      this warning message persists check that all names and labels have been
      defined in the text}%
  }{%else
    % do nothing
  }%end if
}%end def
%    \end{macrocode}
% \end{itemize}
%
% \subsection{Internal Macros}
%
% \begin{macro}{\CN@mainpartofkey} 
%   Splits the representation of a key as |Main!Sub|, returning only the
%   |Main| part.
%    \begin{macrocode}
\gdef\CN@mainpartofkey (#1!#2){#1}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@MainKey}
%   Acts as a driver macro for |\CN@mainpartofkey| macro.
%    \begin{macrocode}
\gdef\CN@MainKey (#1){\CN@mainpartofkey(#1!)}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@definenewchemical}\marg{main!sub
%   key}\marg{name}\marg{sub-label}
%   Associate a key with a chemical name and sub-label. The instances of
%   this macro written in the \textsf{aux} file are what define the
%   current mapping of key to names and sub-labels. There is a check to
%   make sure the key is unique but there is no check that the sub-label
%   is unique.
%
%   This macro is the main macro that creates the table of key name and
%   labels that is used by the other macros to generate output in the
%   document.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@definenewchemical}[3]{%key, name, label
  % check for previous definition of name
  \ifcsname CN@#1@label\endcsname%ifdef
  % previous definition, do nothing
  \CN@DEBUG{chemsec}{Attempt to redefine key "#1" ignored.}%
  \else%
  % label not defined
  \CN@DEBUG{chemsec}{Defining new compound with key "#1". Name is "#2", sub-label is "#3".}%
  \expandafter\gdef\csname CN@#1@label\endcsname{0}%
  \expandafter\gdef\csname CN@#1@name\endcsname{#2}%
  \ifthenelse{\equal{#3}{-}}{%if no sub-label
  }{%else
    \ifthenelse{\equal{#3}{}}{%if no sub-label
    }{%else
      \expandafter\gdef\csname CN@#1@sublabel\endcsname{#3}%
    }%end if
  }%end if
  \fi%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@defineLabelUsed} \marg{main!sub key} \marg{label
%   index} Associate a label with a |main| key. The instances of this
%   macro written in the \textsf{aux} file are what define the mapping
%   of key to label used to typeset a label before a macro call that
%   defines the position of the key in document order, and hence its
%   true label.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@defineLabelUsed}[2]{%key, label
  % check for previous definition of name
  \ifcsname CN@#1@labelUsed\endcsname%ifdef
    \CN@DEBUG{chemsec}{Attempt to redefine label for key "#1" ignored.}%
  \else
    % label not defined
    \expandafter\gdef\csname CN@#1@labelUsed\endcsname{#2}%
    \CN@DEBUG{chemsec}{defineLabelUsed: Presetting label of key "#1" to "#2" -> "\csname CN@#1@labelUsed\endcsname"}%
  \fi%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@defineSublabelUsed} \marg{main!sub key}
% \marg{label value}
%   Associate a sublabel with a |main!sub| key. The instances of this macro written in
%   the \textsf{aux} file are what define the mapping of key to sublabel
%   used to typeset a sublabel before a macro call that defines the position
%   of the key in document order, and hence its true sublabel.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@defineSublabelUsed}[2]{%key, sublabel
  % check for previous definition of name
  \ifcsname CN@#1@sublabelUsed\endcsname%ifdef
    \CN@DEBUG{chemsec}{Attempt to redefine sublabel for key "#1" ignored.}%
  \else
    % label not defined
    \expandafter\gdef\csname CN@#1@sublabelUsed\endcsname{#2}%

    \CN@DEBUG{chemsec}{defineLabelUsed: Presetting sublabel of key "#1" to "#2" -> "\csname CN@#1@sublabelUsed\endcsname"}%
  \fi%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@GetFullName}
%   Check that a name is defined for the given key. If no name exists
%   then check using only the |Main| part of a |Main!Sub| key.  If still no
%   name is found then output ``|??|'' and print an error message to the
%   processing log.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@GetFullName}[1]{%
  \ifcsname CN@#1@name\endcsname%if name
  % use my own name
  \csname CN@#1@name\endcsname%
  \else%
  \ifcsname CN@\CN@MainKey(#1)@name\endcsname%if main key name
  % Use main key name
  \csname CN@\CN@MainKey(#1)@name\endcsname%
  \else%
  \CN@WARN{chemsec}{Attempt to find name for key "#1" failed.}%
  \setboolean{CN@Warning}{true}%
  ??%
  \fi%endif main
  \fi%endif full key
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@GetLabel}
%   Check that a label is defined for the given key. If no label exists
%   then check using only the |Main| part of a |Main!Sub| key.  If still
%   no label is found then if the star form is used output the value of
%   the label from the previous time the document was processed
%   (actually the value from |\CN@defineLabelUsed| calls in the
%   \textsl{aux} file) or |0| (zero). If the not a star form then the
%   label is calculated by incrementing the
%   \textsf{CN\@{}MaxLabelIndex}. This also writes a call to
%   |\CN@defineLabelUsed| in the \textsl{aux} for the next processing
%   run.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@GetLabel}[3]{% key, foundbool,
  % indexcount
  \setboolean{#2}{true}%
  \CN@DEBUG{chemsec}{GetLabel: looking for '#1'}%
  \setcounter{#3}{\csname CN@#1@label\endcsname}%
  \CN@DEBUG{chemsec}{GetLabel: Label count is \arabic{#3}}%
  \CN@DEBUG{chemsec}{GetLabel: Star form is {\ifCN@Star true\else false\fi}}%
  \ifthenelse{\value{#3} = 0}{%
     %% label has NOT been defined
     \CN@DEBUG{chemsec}{GetLabel: No local label for key '#1' is defined.}%
     \ifthenelse{\boolean{CN@Star}}{%
       %% Star form means can only use predefined value
       \ifcsname CN@#1@labelUsed\endcsname% have predefined value
         \CN@DEBUG{chemsec}{GetLabel: Predefined label for key '#1' is \csname CN@#1@labelUsed\endcsname.}%
         \setcounter{#3}{\csname CN@#1@labelUsed\endcsname}%
       \else% no predefined, set warning
         \setboolean{CN@Warning}{true}%
         \CN@DEBUG{chemsec}{GetLabel: No predefined label for key '#1'.}%
       \fi%
     }{%
       %% Non-star form means calculate value
       \CN@DEBUG{chemsec}{GetLabel: MaxLabelIndex is \arabic{CN@MaxLabelIndex}}%
       \stepcounter{CN@MaxLabelIndex}%
       \CN@DEBUG{chemsec}{GetLabel: Increment MaxLabelIndex to \arabic{CN@MaxLabelIndex}}%
       \expandafter\xdef\csname CN@#1@label\endcsname{\arabic{CN@MaxLabelIndex}}%
       \write\@auxout{\string\CN@defineLabelUsed{#1}{\csname CN@#1@label\endcsname}}%
       \setcounter{#3}{\csname CN@#1@label\endcsname}%
       \setboolean{#2}{false}%
       %% Check that @labelUsed matches @label or set @Warning
       \ifcsname CN@#1@labelUsed\endcsname%
         \ifthenelse{\equal{\csname CN@#1@labelUsed\endcsname}{\csname CN@#1@label\endcsname}}{% predefined label matches label - do nothing
         }{% predefined does not match.
           \CN@DEBUG{chemsec}{GetLabel: Local label does not match predefined label}
           \setboolean{CN@Warning}{true}%
         }%
       \fi
    }%
  }{%else
    % do nothing
  }%end if def to 0
  \CN@DEBUG{chemsec}{GetLabel: Result counter \arabic{#3}}%
}%end def
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@GetSubLabel}
%   Check that a sublabel is defined for the given key. If the star form
%   is used output the value of the label from the previous time the
%   document was processed (actually the value from
%   |\CN@defineSubLabelUsed| calls in the \textsl{aux} file) or |??|. If
%   not a star form and no sublabel exists then try and calculate a
%   value based on the number of keys having the same |Main| part of the
%   |Main!Sub| key. This also writes a call to |\CN@defineSubLabelUsed|
%   in the \textsl{aux} for the next processing run.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@GetSubLabel}[3]{% key, found?, return-element
  \setboolean{#2}{true}%
  \CN@DEBUG{chemsec}{GetSubLabel: looking for sublabel of '#1'}%
  \ifthenelse{\equal{\CN@MainKey(#1)}{#1}}{%if a main key
    \CN@DEBUG{chemsec}{GetSubLabel: '#1' is a main key .: no sublabel}%
    \xdef#3{}%
  }{%else
    \ifcsname CN@#1@sublabel\endcsname%if defined
      \CN@DEBUG{chemsec}{GetSubLabel: Sublabel previously defined as '\csname
      CN@#1@sublabel\endcsname'}%
      \xdef#3{\csname CN@#1@sublabel\endcsname}%
    \else% else need to define sublabel
      \setboolean{#2}{false}%
      \ifthenelse{\boolean{CN@Star}}{%
         % Star form means can only use predefined value
         \ifcsname CN@#1@sublabelUsed\endcsname% have predefined value
           \CN@DEBUG{chemsec}{GetSubLabel: Predefined sublabel for key '#1' is \csname CN@#1@sublabelUsed\endcsname.}%
           \xdef#3{\csname CN@#1@sublabelUsed\endcsname}%
         \else% no predefined, set warning
           \setboolean{CN@Warning}{true}%
           \CN@DEBUG{chemsec}{GetSubLabel: No predefined sublabel for key
             '#1'.}%
           \xdef#3{??}%
         \fi%
       }{%
        \CN@DEBUG{chemsec}{GetSubLabel: Sublabel not previously defined}%
        \ifcsname CN@\CN@MainKey(#1)@sublabel\endcsname%if
          % main key def
          \setcounter{CN@SubLabelIndex}{\csname CN@\CN@MainKey(#1)@sublabel\endcsname}%
        \else%
          \setcounter{CN@SubLabelIndex}{0}%
        \fi%
        \CN@DEBUG{chemsec}{GetSubLabel: Highest label for these keys is
          \arabic{CN@SubLabelIndex}.}%
        \stepcounter{CN@SubLabelIndex}%
        \expandafter\xdef\csname CN@\CN@MainKey(#1)@sublabel\endcsname{\arabic{CN@SubLabelIndex}}%
        \expandafter\xdef\csname CN@#1@sublabel\endcsname{\ChemSubCounterStyle{CN@SubLabelIndex}}%
        \write\@auxout{\string\CN@defineSublabelUsed{#1}{\csname CN@#1@sublabel\endcsname}}%
        \CN@DEBUG{chemsec}{GetSubLabel: Sublabel now defined as '\csname
          CN@#1@sublabel\endcsname'}%
        \xdef#3{\csname CN@#1@sublabel\endcsname}%
      }%
    \fi%end if
  }%end if
}% enddef
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@RealCite}
%   Search for the label and sublabel for a given key.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@RealCite}[4]{%key,
  % found, index-counter,
  % sub
  \CN@DRAFT{#1}%
  \CN@DEBUG{chemsec}{In RealCite}%
  \setcounter{#3}{0}%
  \setcounter{CN@SubLabelIndex}{0}%
  \setboolean{#2}{false}%
  \xdef#4{}%
  \CN@DEBUG{chemsec}{Real: calling GetLabel for '\CN@MainKey(#1)', the main
    part of '#1'}%
  \CN@GetLabel{\CN@MainKey(#1)}{#2}{#3}%
  \CN@DEBUG{chemsec}{Real: calling GetSubLabel for "#1"}%
  \CN@GetSubLabel{#1}{CN@ScanList}{#4}%
}%end def
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\NoCite}
%   Search for the label and sublabel for a given key without producing
%   any output. This can be used to define the label associated with a
%   key without anything being typeset in the document.
%    \begin{macrocode}
\DeclareRobustCommand*{\NoCite}[1]{%
  \CN@RealCite{#1}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@ChemCite}
%   Output name, label and sublabel for a given key. The name is output
%   only if |CN@KeyFound| is \textsf{false} which occurs the first time
%   a key is cited.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@ChemCite}[1]{%
  % \CN@DEBUG{chemsec}{in Chemcite}%
  \CN@RealCite{#1}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
  % \CN@DEBUG{chemsec}{Cite: called Real}%
  \ifthenelse{\boolean{CN@KeyFound}}{%
    % \CN@DEBUG{chemsec}{Cite: key found, use Short}%
    \ChemShortLabelStyle{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
  }{%else
    % \CN@DEBUG{chemsec}{Cite: key not found, use Long}%
    \ChemFullLabelStyle{\CN@GetFullName{#1}}{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
  }%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@ChemFCite}
%   Output name, label and sublabel for a given key. The name is always
%   output.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@ChemFCite}[1]{%
  % \CN@DEBUG{chemsec}{in ChemFullCite}%
  \CN@RealCite{#1}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
  % \CN@DEBUG{chemsec}{Cite: called Real}%
  \ChemFullLabelStyle{\CN@GetFullName{#1}}{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@ChemSCite}
%   Output label and sublabel for a given key. The name is never output.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@ChemSCite}[1]{%
  % \CN@DEBUG{chemsec}{in ChemShortCite}%
  \CN@RealCite{#1}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
  % \CN@DEBUG{chemsec}{SCite: called Real}%
  \ChemShortLabelStyle{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@ChemMFCite}
%   Output name associated with the |Main| part of the |Main!Sub| key as
%   well as the label \textit{and} sublabel.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@ChemMFCite}[1]{%
  % \CN@DEBUG{chemsec}{in ChemMainFullCite}%
  \CN@RealCite{\CN@MainKey(#1)}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
  % \CN@DEBUG{chemsec}{Cite: called Real}%
  \ChemFullLabelStyle{\CN@GetFullName{\CN@MainKey(#1)}}{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@ChemMSCite}
%   Output the label for the |Main| part of the |Main!Sub| key.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@ChemMSCite}[1]{%
  % \CN@DEBUG{chemsec}{in ChemMainShortCite}%
  \CN@RealCite{\CN@MainKey{#1}}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
  % \CN@DEBUG{chemsec}{SCite: called Real}%
  \ChemShortLabelStyle{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@ChemCiteStar}
%   Set |CN@Star| boolean before calling base |\CN@ChemCite|.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@ChemCiteStar}[1]{%
  % \CN@DEBUG{chemsec}{in Chemcite}%
  \setboolean{CN@Star}{true}%
  \CN@ChemCite{#1}%
  \setboolean{CN@Star}{false}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@ChemFCiteStar}
%   Set |CN@Star| boolean before calling base |\CN@ChemFCite|.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@ChemFCiteStar}[1]{%
  % \CN@DEBUG{chemsec}{in ChemFullCite}%
  \setboolean{CN@Star}{true}%
  \CN@ChemFCite{#1}%
  \setboolean{CN@Star}{false}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@ChemSCiteStar}
%   Set |CN@Star| boolean before calling base |\CN@ChemSCite|.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@ChemSCiteStar}[1]{%
  % \CN@DEBUG{chemsec}{in ChemShortCite}%
  \setboolean{CN@Star}{true}%
  \CN@ChemSCite{#1}%
  \setboolean{CN@Star}{false}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@ChemMFCiteStar}
%   Set |CN@Star| boolean before calling base |\CN@ChemMFCite|.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@ChemMFCiteStar}[1]{%
  % \CN@DEBUG{chemsec}{in ChemMainFullCite}%
  \setboolean{CN@Star}{true}%
  \CN@ChemMFCite{#1}%
  \setboolean{CN@Star}{false}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CN@ChemMSCiteStar}
%   Set |CN@Star| boolean before calling base |\CN@ChemMSCite|.
%    \begin{macrocode}
\DeclareRobustCommand*{\CN@ChemMSCiteStar}[1]{%
  % \CN@DEBUG{chemsec}{in ChemMainShortCite}%
  \setboolean{CN@Star}{true}%
  \CN@ChemMSCite{#1}%
  \setboolean{CN@Star}{false}%
}%
%    \end{macrocode}
% \end{macro}
%
% \subsection{Public Interface Macros}
%
% \begin{macro}{\ChemCite}
%   Delegate to |\CN@ChemCiteStar| or |\CN@ChemCite| depending on
%   whether ``|*|'' was used.  \changes{1.10}{1999/12/10}{This version
%   provides star forms of the standard commands (except for
%   |NoCite|). The star forms use in order; the current label if defined
%   or a value stored in the \textsl{aux} file from the previous time
%   the document was processed if defined or a dummy value. As these
%   files are read in before the document, but in order they should
%   provide the author with greater flexibility in defining the
%   numbering order. Either the author should define a sublabel for all
%   compounds using the (no-longer) optional sublabel field to disable
%   auto-numbering or use the |NoCite| and |Chem?Cite*| commands to get
%   the desired numbering.}
%    \begin{macrocode}
\DeclareRobustCommand*{\ChemCite}{%
  \@ifstar{\CN@ChemCiteStar}{\CN@ChemCite}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ChemFCite}
%   Delegate to |\CN@ChemFCiteStar| or |\CN@ChemFCite| depending on
%   whether ``|*|'' was used.
%    \begin{macrocode}
\DeclareRobustCommand*{\ChemFCite}{%
  \@ifstar{\CN@ChemFCiteStar}{\CN@ChemFCite}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ChemSCite}
%   Delegate to |\CN@ChemSCiteStar| or |\CN@ChemSCite| depending on
%   whether ``|*|'' was used.
%    \begin{macrocode}
\DeclareRobustCommand*{\ChemSCite}{%
  \@ifstar{\CN@ChemSCiteStar}{\CN@ChemSCite}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ChemMFCite}
%   Delegate to |\CN@ChemMFCiteStar| or |\CN@ChemMFCite| depending on
%   whether ``|*|'' was used.
%    \begin{macrocode}
\DeclareRobustCommand*{\ChemMFCite}{%
  \@ifstar{\CN@ChemMFCiteStar}{\CN@ChemMFCite}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ChemMSCite}
%   Delegate to |\CN@ChemMSCiteStar| or |\CN@ChemMSCite| depending on
%   whether ``|*|'' was used.
%    \begin{macrocode}
\DeclareRobustCommand*{\ChemMSCite}{%
  \@ifstar{\CN@ChemMSCiteStar}{\CN@ChemMSCite}%
}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DefineChemical}\marg{main!sub key}\marg{name}\marg{label}
%   Associate a key with a chemical name and sub-label by inserting a
%   |\CN@definenewchemical| macro call into the \textsf{aux} file.
%    \begin{macrocode}
\DeclareRobustCommand*{\DefineChemical}[3]{%
  \CN@definenewchemical{#1}{#2}{#3}%
  \write\@auxout{\string\CN@definenewchemical{#1}{#2}{#3}}%
}%end def
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\makeatother
%    \end{macrocode}
%
% \Finale
\endinput