%% %% This is file `langsci-affiliations.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% langsci-affiliations.dtx (with options: `package') %% ------------------------------------------------------------------------------ %% %% langsci-affiliations collects, orders, and outputs author-affiliation pairs. %% It makes use of data types from LaTeX3. %% %% The package is aimed to be helpful to class authors, i.e. those who design %% and maintain document templates in publishing houses, universities, etc. The %% package is probably of only limited use to document authors/end users. %% %% langsci-affiliations was developed at Language Science Press to help in the %% production of scientific texts in linguistics. %% %% Copyright (C) 2021 by Felix Kopecky, Language Science Press %% %% This work consists of the file langsci-affiliations.dtx %% and the derived files langsci-affiliations.ins, %% langsci-affiliations.pdf. %% %% It may be distributed and/or modified under the conditions of the %% LaTeX Project Public License (LPPL), either version 1.3c of this %% license or (at your option) any later version. The latest version %% of this license is at . %% %% This work is ``maintained'' (per LPPL maintenance status) by %% Felix Kopecky . %% %% The development version can be found at %% %% https://github.com/langsci/langsci-affiliations %% %% for those who are interested. Pull requests are welcome. %% %% Please report any bugs or feature requests to %% %% https://github.com/langsci/langsci-affiliations/issues %% %% ------------------------------------------------------------------------------ \RequirePackage{xparse} \ProvidesExplPackage {langsci-affiliations} {2021-02-17} {1.0.1} {A LaTeX3 package to collect and order authors and affiliations} \NewDocumentCommand{\ResolveAffiliations}{ O{} +m } {% \group_begin: \keys_set:nn { affiliations } { #1 }% \exp_args:No \affiliations_resolve:n { #2 }% \group_end: } \NewDocumentCommand{\SetupAffiliations}{ m } {% \keys_set:nn { affiliations } { #1 } } \keys_define:nn { affiliations } { mark~style .tl_set:N = \l__affiliations_style_tl, mark~style .initial:n = { alphabetic }, output~affiliation .bool_set:N = \l__affiliations_output_affiliation_bool, output~affiliation .initial:n = { true }, output~in~groups .bool_set:N = \l__affiliations_output_grouped_bool, output~in~groups .initial:n = { true }, separator~between~two .tl_set:N = \l__affiliations_separator_between_two_tl, separator~between~two .initial:n = {~\&~}, separator~between~multiple .tl_set:N = \l__affiliations_separator_between_mult_tl, separator~between~multiple .initial:n = {,~}, separator~between~final~two .tl_set:N = \l__affiliations_separator_between_last_two_tl, separator~between~final~two .initial:n = {~\&~}, separator~between~affiliations .tl_set:N = \l__affiliations_afil_separator_tl, separator~between~affiliations .initial:n = {,}, output~authors~font .cs_set:Np = \__affiliations_output_authors_font:, output~authors~font .initial:n = {\Large}, output~affiliation~font .cs_set:Np = \__affiliations_output_affiliation_font:, output~affiliation~font .initial:n = {\normalsize}, input~names~separator .tl_set:N = \l__affiliations_input_names_sep_tl, input~names~separator .initial:n = {~and~}, input~affiliation~separator .tl_set:N = \l_affiliations_input_afil_sep_tl, input~affiliation~separator .initial:n = {;} } \cs_generate_variant:Nn \prop_put:Nnn { Nxx } \cs_generate_variant:Nn \prop_put:Nnn { Nnx } \cs_generate_variant:Nn \seq_set_split:Nnn { NVn } \clist_new:N \l__affiliations_tmpa_clist \int_new:N \l__affiliations_tmpa_int \prop_new:N \l__affiliations_tmpa_prop \seq_new:N \l__affiliations_affiliations_seq \seq_new:N \l__affiliations_authors_seq \seq_new:N \l__affiliations_names_seq \seq_new:N \l__affiliations_tmpa_seq \seq_new:N \l__affiliations_tmpb_seq \tl_new:N \l__affiliations_tmpa_tl \tl_new:N \l__affiliations_tmpb_tl \prop_new:N \l__affiliations_output_prop \prop_new:N \l__affiliations_affiliations_prop \prop_const_from_keyval:Nn \l__affiliations_icons_prop { 0 = \char"2460, 1 = \char"2461, 2 = \char"2462, 3 = \char"2463, 4 = \char"2464, 5 = \char"2465, 6 = \char"2466, 7 = \char"2467, 8 = \char"2468, 9 = \char"2469, 10 = \char"246A, 11 = \char"246B, 12 = \char"246C, 13 = \char"246D, 14 = \char"246E, 15 = \char"246F, 16 = \char"2470, 17 = \char"2471, 18 = \char"2472, 19 = \char"2473 } \cs_new:Npn \__affiliations_resolve_affiliations: #1#2 { \clist_clear:N \l__affiliations_tmpa_clist \tl_if_empty:nTF {#2} { \prop_put:Nnn \l__affiliations_output_prop {#1} {} } { \seq_set_split:NVn \l__affiliations_tmpa_seq \l_affiliations_input_afil_sep_tl { #2 } \seq_map_inline:Nn \l__affiliations_tmpa_seq { \prop_get:NnNTF \l__affiliations_affiliations_prop {##1} \l__affiliations_tmpa_tl { \clist_put_right:NV \l__affiliations_tmpa_clist \l__affiliations_tmpa_tl } { %Not yet present \clist_put_right:Nx \l__affiliations_tmpa_clist { \prop_count:N \l__affiliations_affiliations_prop } \prop_put:Nnx \l__affiliations_affiliations_prop {##1} { \prop_count:N \l__affiliations_affiliations_prop } } } \prop_put:NnV \l__affiliations_output_prop {#1} \l__affiliations_tmpa_clist } } \cs_new:Nn \__affiliations_output_affiliations: { \prop_map_inline:Nn \l__affiliations_affiliations_prop { \int_set:Nn \l__affiliations_tmpa_int { ##2 } \str_case_e:nn { \l__affiliations_style_tl } { {alphabetic} { \textsuperscript{\int_to_alph:n{ \int_eval:n { \l__affiliations_tmpa_int + 1 } } } } {numeric} { \textsuperscript{\int_eval:n {\l__affiliations_tmpa_int + 1} } } {circled} { \prop_item:Nn \l__affiliations_icons_prop {\l__affiliations_tmpa_int} } {none} { } } ##1 ~ } } \cs_new:Npn \__affiliations_return_afil_text:n #1 { \int_set:Nn \l__affiliations_tmpa_int { #1 } \str_case_e:nn { \l__affiliations_style_tl } { {alphabetic} { \seq_put_right:Nx \l__affiliations_tmpb_seq { \int_to_alph:n{ \int_eval:n {#1 + 1} } } } {numeric} { \seq_put_right:Nx \l__affiliations_tmpb_seq { \int_eval:n {\l__affiliations_tmpa_int + 1} } } {circled} { \seq_put_right:Nx \l__affiliations_tmpb_seq { \prop_item:Nn \l__affiliations_icons_prop { \l__affiliations_tmpa_int} } } {none} { } } } \cs_new:Nn \__affiliations_output_authors: { \seq_clear:N \l__affiliations_tmpa_seq \prop_map_inline:Nn \l__affiliations_output_prop { \seq_clear:N \l__affiliations_tmpb_seq \clist_map_function:nN {##2} \__affiliations_return_afil_text:n \tl_set:Nn \l__affiliations_tmpb_tl { \seq_use:Nn \l__affiliations_tmpb_seq {\l__affiliations_afil_separator_tl} } \seq_put_right:Nx \l__affiliations_tmpa_seq { \tl_rescan:nn {} {##1} \exp_not:N \textsuperscript{\tl_use:N \l__affiliations_tmpb_tl} } } \seq_use:Nnnn \l__affiliations_tmpa_seq {\l__affiliations_separator_between_two_tl} {\l__affiliations_separator_between_mult_tl} {\l__affiliations_separator_between_last_two_tl} } \cs_new:Npn \affiliations_resolve:n #1 { \seq_set_split:NVn \l__affiliations_names_seq \l__affiliations_input_names_sep_tl { #1 } \seq_map_inline:Nn \l__affiliations_names_seq { \seq_clear_new:N \l__affiliations_names_tmp_seq \seq_set_split:Nnn \l__affiliations_names_tmp_seq { \affiliation } { ##1 } \prop_put:Nxx \l__affiliations_tmpa_prop { \seq_item:Nn \l__affiliations_names_tmp_seq {1} } { \seq_item:Nn \l__affiliations_names_tmp_seq {2} } } \bool_if:NTF \l__affiliations_output_affiliation_bool { \bool_if:NTF \l__affiliations_output_grouped_bool { \prop_map_function:NN \l__affiliations_tmpa_prop \__affiliations_resolve_affiliations: \group_begin: \__affiliations_output_authors_font: \__affiliations_output_authors: \group_end:\\[0.5ex] \group_begin: \__affiliations_output_affiliation_font: \__affiliations_output_affiliations: \group_end: } { \prop_map_inline:Nn \l__affiliations_tmpa_prop { \__affiliations_output_authors_font: \tl_rescan:nn {} {##1}\\[0.5ex] \group_begin: \__affiliations_output_affiliation_font: \tl_rescan:nn {} {##2} \group_end: \medskip\\ } \vspace*{-\baselineskip-\medskipamount} } } { \group_begin: \__affiliations_output_authors_font: \seq_clear:N \l__affiliations_tmpa_seq \prop_map_inline:Nn \l__affiliations_tmpa_prop { \seq_put_right:Nx \l__affiliations_tmpa_seq {\tl_rescan:nn {} {##1} } } \seq_use:Nnnn \l__affiliations_tmpa_seq {\l__affiliations_separator_between_two_tl} {\l__affiliations_separator_between_mult_tl} {\l__affiliations_separator_between_last_two_tl} \group_end: } } %% %% %% End of file `langsci-affiliations.sty'.