// -*- ASCII:EDT -*- // bibSort54.edt // part of the bibMacros package // (schlicht 20010718) // $Revision: 1.1 $ /////////////////////////// //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Requires(20020323);// (WinEdt 5.3) %% // This macro will only work with this version of WinEdt %% // (or better). You can get the latest version of WinEdt %% // from . %% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Read the global configuration file, if it exists: IfFileExists("%b\Macros\LaTeX\bibMacros.cfg",> !"Exe('%b\Macros\LaTeX\bibMacros.cfg');",> !"IfFileExists('%B\Macros\LaTeX\bibMacros.cfg',> 'Exe(''%B\Macros\LaTeX\bibMacros.cfg'');',> !'Assign(''bib_beginLine'',''<'');> Assign(''bib_sortFirst'',''author|editor'');> Assign(''bib_sortSecond'',''year'');> Assign(''bib_sortCrossrefs'',''yes'');> Assign(''bib_sortNrAuthors'',''3'');> Assign(''Borb'',> !*IfFileExists(''%b\%$(|BorbFile|);'',> !''Assign(""%$(|BorbName|);"",""%b\%$(|BorbFile|);"");'',> !''IfFileExists(""%B\%$(|BorbFile|);"",> !""Assign(''''%$(|BorbName|);'''',''''%B\%$(|BorbFile|);'''');"",> !""Assign(''''%$(|BorbName|);'''',''''???'''');"");'');> Release(''BorbName'');> Release(''BorbFile'');> *);'> );"> ); IfStr("%$('bib_sortFirst');","","=","Assign('bib_sortFirst','author|editor');"); IfStr("%$('bib_sortSecond');","","=","Assign('bib_sortSecond','year');"); IfStr("%$('bib_sortFirst');","OK","=","Assign('bib_sortFirst','author|editor');"); IfStr("%$('bib_sortSecond');","OK","=","Assign('bib_sortSecond','year');"); IfStr("%$('bib_sortCrossrefs');","","=","Assign('bib_sortCrossrefs','yes');"); // You will be asked for the sort criteria, except you don't want to. IfStr("%$('bib_sortPrompt');","no","=","",!`> IfStr("%$('bib_bibStyle');","","=","",!"> Assign('BorbName','BM_Fields_%$(|bib_bibStyle|);.cfg');> Assign('BorbFile','Macros\LaTeX\bibMacrosFields_%$(|bib_bibStyle|);.cfg');> IfStr('%[|%$(:Borb:);|];%$(|BM_Fields_%$(*bib_bibStyle*);.cfg|);','???','=','',> 'Exe(''%$(|BM_Fields_%$(*bib_bibStyle*);.cfg|);'');');"> );> Assign("BorbName","BM_Fields.cfg");> Assign("BorbFile","Macros\LaTeX\bibMacrosFields.cfg");> IfStr("%['%$(|Borb|);'];%$('BM_Fields.cfg');","???","=",> !"Assign('bib_FIELDS',!'{author=}{editor=}{title=}{booktitle=}{year=}{journal=}{howpublished=}> {type=}{chapter=}{pages=}{volume=}{series=}{number=}{crossref=}{key=}{address=}{publisher=}> {organization=}{school=}{institution=}{edition=}{month=}{note=}{url=}{keywords=}{abstract=}> {source=}{annote=}');",> !"Exe('%$(|BM_Fields.cfg|);');");> // Check if MUI plug-in is installed: Assign("BorbName","BM_MUI");> Assign("BorbFile","Plugins\MUI\mui.exe");> IfFileExists("%['%$(|Borb|);'];%$('BM_MUI');",!:> IfStr("%$('bib_FIELDS%$(|bib_bibStyle|);');","","=","Release('bib_bibStyle');");> LetReg(9,"First");> OpenOutput("%b\Macros\LaTeX\bibSort.mui");> WrL("MUITitle(""Sort Bibliography"");");> WrL("MUIWidth(300);");> Repeat(2,!"> WrL('MUILabel(""%!9 sort criterion"");');> IfStr('%!9','Second','=',!'> LetRegNum(2,1);> LetRegNum(3,5);> LetReg(4,''MUIComboBox(""|KEY|TYPE|author OR editor'');// combo1 + combo2 <> IfStr(''%$(|bib_sortSecond|);'','''',''='',> ''Assign(|bib_sortSecond|,|OK|); LetReg(3,|,1|);'');',> !'LetRegNum(2,0);> LetRegNum(3,4);> LetReg(4,''MUIComboBox(""KEY|TYPE|author OR editor'');');> IfStr('%$(|bib_sort%!9|);','KEY','=',!'Assign(''bib_sort%!9'',''OK''); LetRegNum(3,1+%!2); LetReg(3,'',%!3'');');> IfStr('%$(|bib_sort%!9|);','TYPE','=',!'Assign(''bib_sort%!9'',''OK''); LetRegNum(3,2+%!2); LetReg(3,'',%!3'');');> IfStr('%$(|bib_sort%!9|);','author|editor','=',!'Assign(''bib_sort%!9'',''OK''); LetRegNum(3,3+%!2); LetReg(3,'',%!3'');');> LetRegNum(2,0);> Loop(!'> SetOK(1);> FindInString(''%$(|bib_FIELDS%$(*bib_bibStyle*);|);'',''\{\(*\)='',1,2,1001,%!2);> IfOK(!''GetTag(0,1);> FindInString(|%!1|,|author||editor|,5,6,1);> IfOK(||,!|LetReg(4,""%!4||%!1"");> IfStr(""%$(*bib_sort%!9*);"",""OK"",""="","""",!""> IfStr(||%$(*bib_sort%!9*);||,||%!1||,||=||,> ||Assign(*bib_sort%!9*,*OK*); LetReg(3,*,%!3*);||,> ||LetRegNum(3,%!3+1);||);"");|);'',> ''Stop;'');> ');> WrL('%!4""%!3);');> WrL('MUILabel(''Or enter a criterion not in the list (use ""|"" for OR)::'');');> IfStr('%$(|bib_sort%!9|);','OK','=','LetReg(3,'''');',!'LetReg(3,''%$(|bib_sort%!9|);'');');> WrL('MUIEditBox(""%!3"");'); // edit1 + edit2 <> IfStr('%$(|bib_sortOrder%!9|);','0','=','LetRegNum(3,2);','LetRegNum(3,1);');> WrL('MUIRadioButton(""Ascending|Descending"",%!3,""Sorting Order"");'); // radio1 + radio2 <> WrL('MUILabel("" "");');> LetReg(9,'Second');> ");> IfStr("%$('bib_sortCrossrefs');","yes","=","LetRegNum(3,1);","LetRegNum(3,0);");> WrL("MUICheckBox(""Move all cross-referenced entries to the end."",%!3);"); // check1 <> IfStr("%$('bib_sortNrAuthors');","","=","LetReg(3,'3');","LetReg(3,'%$(|bib_sortNrAuthors|);');");> WrL("MUILabelEditBox(""Number of authors/editors relevant for sorting::"",""%!3"");"); // edit3 <> WrL("MUILabel("" "");");> IfSel(1,"=",!"> IfStr('%$(|bib_sortSelected|);','yes','=','LetRegNum(3,1);','LetRegNum(3,0);');> WrL('MUICheckBox(""Sort selected entries only"",%!3);');",""); // check2 <> CloseOutput;> Release("MUIComboBox1");> Release("MUIComboBox2");> Release("MUIEditBox1");> Release("MUIEditBox2");> Release("MUIEditBox3");> Release("MUIRadioButton1");> Release("MUIRadioButton2");> Release("MUICheckBox1");> Release("MUICheckBox2");> // run MUI WinExe("","%$('BM_MUI'); ""%b\Macros\LaTeX\bibSort.mui""","","",000100);> SetFocus("");> DeleteFile("%b\Macros\LaTeX\bibSort.mui");> IfStr("%$('MUIOK');","1","=","","Exit;");> IfStr("%$('MUIEditBox1');","","=",> !"IfStr('%$(|MUIComboBox1|);','author OR editor','=',> 'Assign(''bib_sortFirst'',''author|editor'');',> 'Assign(''bib_sortFirst'',''%$(|MUIComboBox1|);'');');",> !"Assign('bib_sortFirst','%$(|MUIEditBox1|);')");> IfStr("%$('bib_sortFirst');","KEY","=",> "Release('bib_sortSecond');",> !"IfStr('%$(|MUIEditBox2|);','','=',> !'IfStr(''%$(|MUIComboBox2|);'',''author OR editor'',''='',> ''Assign(|bib_sortSecond|,|author||editor|);'',> ''IfStr(|%$(*MUIComboBox2*);|,||,|=|,> |Release(||bib_sortSecond||);|,> !|Assign(||bib_sortSecond||,||%$(*MUIComboBox2*);||);|);'');',> !'Assign(''bib_sortSecond'',''%$(|MUIEditBox2|);'');');");> IfStr("%$('bib_sortFirst');","","=",> !"IfStr('%$(|bib_sortSecond|);','','=',> !'Prompt(''You have to specify at least one sort criterion!'',3,1); Exit;',> !'Assign(''bib_sortFirst'',''%$(|bib_sortSecond|);''); Release(''bib_sortSecond'');');");> IfStr("%$('MUIRadioButton1');","Ascending","=",> "Assign('bib_sortOrderFirst','1');",> "Assign('bib_sortOrderFirst','0');");> IfStr("%$('MUIRadioButton2');","Ascending","=",> "Assign('bib_sortOrderSecond','1');",> "Assign('bib_sortOrderSecond','0');");> IfStr("%$('MUICheckBox1');","1","=",> "Assign('bib_sortCrossrefs','yes');",> "Assign('bib_sortCrossrefs','no');");> IfStr("%$('MUIEditBox3');","","=","Assign('MUIEditBox3','3');");> FindInString("%$('MUIEditBox3');","^[0-9]",1,2,1);> IfOK(!"Assign('bib_sortNrAuthors','3');",!"Assign('bib_sortNrAuthors','%$(|MUIEditBox3|);');");> IfNum("%$('bib_sortNrAuthors');",0,"=","Assign('bib_sortNrAuthors','1');");> IfSel(1,"=",!"> IfStr('%$(|MUICheckBox2|);','1','=',> !'Assign(|bib_sortSelected|,|yes|);',> !'Assign(|bib_sortSelected|,|no|);');> ");> :,!:> Prompt("I did not find the MUI plugin!%\I strongly recommend to install it.%\You should get it from .",2,0);> LetReg(1,"%$('bib_sortFirst');");> LetReg(2,"%$('bib_sortSecond');");> EnterReg(1,"First Sort Criterion","Sort Bibliography");> IfStr("%!1","","=","Prompt('First sort criterion cannot be empty!',3,1); Exit;");> Assign("bib_sortFirst","%!1");> IfStr("%!1","KEY","=",!"> Assign('bib_sortSecond','');",> !"EnterReg(2,'Second Sort Criterion','Sort Bibliography');> Assign('bib_sortSecond','%!2');"> );> IfStr("%$('bib_sortOrderFirst');","", "=","Assign('bib_sortOrderFirst','1');");> IfStr("%$('bib_sortOrderSecond');","","=","Assign('bib_sortOrderSecond','1');");> IfStr("%$('bib_sortNrAuthors');","", "=","Assign('bib_sortNrAuthors','3');");:> );`> ); Release("BM_sortOrder"); IfStr("%$('bib_sortOrderFirst');%$('bib_sortOrderSecond');","00","=",> "Assign('BM_sortOrder','0');Assign('BM_sortOrder1','1');Assign('BM_sortOrder2','1');"); IfStr("%$('bib_sortOrderFirst');%$('bib_sortOrderSecond');","11","=", > "Assign('BM_sortOrder','1');Assign('BM_sortOrder1','1');Assign('BM_sortOrder2','1');"); IfStr("%$('BM_sortOrder');","","=",!` // mixed <> IfStr("%$('bib_sortOrderFirst');","0","=",!"> FindInString('/%$(|bib_sortSecond|);/','/year/|/%_/',8,9,1);> IfOK(!'Assign(|BM_sortOrder1|,|1|);Assign(|BM_sortOrder2|,|0|);Assign(|BM_sortOrder|,|0|);',> !'Assign(|BM_sortOrder1|,|0|);Assign(|BM_sortOrder2|,|1|);Assign(|BM_sortOrder|,|1|);');> ",!"// bib_sortOrderSecond == 0 <> SetOK(1);> FindInString('%$(|bib_sortFirst|);','year',8,9,0);> IfOK(!'Assign(|BM_sortOrder1|,|0|);Assign(|BM_sortOrder2|,|1|);Assign(|BM_sortOrder|,|0|);',> !'Assign(|BM_sortOrder1|,|1|);Assign(|BM_sortOrder2|,|0|);Assign(|BM_sortOrder|,|1|);');> ");> `); IfStr("%$('bib_sortFirst');","KEY","=",> !"Assign('BM_sort1','\(9\@\)+$Alpha${\{|(}\(0*\),');",//)<> !"IfStr('%$(|bib_sortFirst|);','TYPE','=',> !'Assign(''BM_sort1'',''\(9\@\)\(0+$Alpha$\){\{|(}'');',> !'Assign(''BM_sort1'',''<@{ }%$(|bib_sortFirst|);@{ }=@{ }{\(9""\)\(0@{>|\\""|^""}\)""@{,}>}|{\(9\{\)\(0@{>|{\{@{>|{\{*\}}|^{\}}}*\}}|^{\}}}@{@{ }\{@{>|{\{@{>|{\{*\}}|^{\}}}*\}}|^{\}}}*\}}\)\}@{,}>}|{\(9\)\(0*\)@{,}>}'');'//)<> );"> ); IfStr("%$('bib_sortSecond');","","=",> !"Assign('BM_sort2','');",> !"IfStr('%$(|bib_sortSecond|);','KEY','=',> !'Assign(''BM_sort2'',''\(9\@\)+$Alpha${\{|(}\(0*\),'');',//)<> !'IfStr(''%$(|bib_sortSecond|);'',''TYPE'',''='',> !''Assign(`BM_sort2`,`\(9\@\)\(0*\){\{|(}`)'',> !''Assign(`BM_sort2`,`<@{ }%$(|bib_sortSecond|);@{ }=@{ }{\(9""\)\(0@{>|\\""|^""}\)""@{,}>}|{\(9\{\)\(0@{>|{\{@{>|{\{*\}}|^{\}}}*\}}|^{\}}}@{@{ }\{@{>|{\{@{>|{\{*\}}|^{\}}}*\}}|^{\}}}*\}}\)\}@{,}>}|{\(9\)\(0*\)@{,}>}`);''//)<> );'> );"> ); IfStr("%$('bib_sortSelected');","yes","<>","SetSel(0);"); // Release old registers, if forgotten LetRegNum(9,-1); Loop(!`> SetOK(1);> FindInString("%$('BM_sortEntries');","<{~>}*>",8,9,1011,%!9);> IfOK(!"> ExtractByIndex(8,'%$(|BM_sortEntries|);',%!8,%!9-2);> Release('%!8');",> "Stop;");> `); Release("BM_sortEntries"); IfSel(1,"=",!"> Assign('BM_lastLine','%l');> CMD('Caret <-> Select');> IfNum(%l,'%$(|BM_lastLine|);','>','Assign(''BM_lastLine'',''%l'');CMD(''Caret <-> Select'');');> ",!"> CMD('Go To Beginning Of File');> Assign('BM_lastLine','999999999');"> ); SaveFind; SetRegEx(1); SetSearchForward(1); SetSearchCaseSensitive(0); SetFindTextSelect(1); SetSearchCurrentDoc; SetSearchCyclic(0); SetSearchEntire(0); SetNotFoundNotify(0); SetFindStr("%$('bib_beginLine');\@{~{STRING|PREAMBLE|COMMENT}+$Alpha$}@{ }{\{|(}"); SearchReset; ResetGroup; BeginGroup; SetTracking(0); LetRegNum(0,0,5,4); Assign("BM_j","%!0"); Release("BM_sortCrossrefs"); Assign("BM_eatChars",!`> Loop("SetOK(1);> FindInString('%%!%$(|BM_i|);','%$(|BM_eat|);',5,3,%$(|BM_eatregular|););> IfOK(!'ReplaceInString(''%%!%$(|BM_i|);'',''%$(|BM_spit|);'',%%!5,%%!3,''10%$(|BM_spitregular|);'',''%$(|BM_i|);'');','Stop;');> ");> `); // *** Build the List *** LetRegNum(6,0); Release("BM_sortError"); Loop(!`> StartWorking("parsing entries (%$('BM_j');) ...");> BeginGroup;> SetOK(1);> IfFound(!"> IfNum(%!6+%l,'%$(|BM_lastLine|);','>=','Stop;',!'> IfNum(''%$(|BM_j|);'',0,''='',''Mark(1);'');> LetRegNum(0,''%$(|BM_j|);+1'',5,4);> Assign(''BM_j'',''%!0'');> // extract the item: LetRegNum(7,%l);> CMD(''Caret <-> Select'');> Mark(0);> GetSel(0,1);> MatchDelimiter(1,0,1,1);> IfOK(!''> LetRegNum(7,%l-%!7+1);> GetSel(0,2);> CMD(|Delete|);> CMD(|Select From Mark|);> CMD(|Delete|);> ReplaceInString(|%!2|,|%!1|,0,0,0,3);> Assign(|BM_entry|,|%!3|);> SetOK(1);> FindInString(|%$(""BM_entry"");|,|\{||(|,3,3,1);> FindInString(|%$(""BM_entry"");|,|,||>|,4,4,1);> ExtractByIndex(3,|%$(""BM_entry"");|,%!3+1,%!4-1);> FormatString(""%!3"",3,""trimboth"");> Assign(|BM_key|,|%!3|);> IfStr(|%$(""bib_sortCrossrefs"");|,|yes|,|=|,!|> // put cross-referenced entries to the end (suggested by Jürgen Dix) SetOK(1);> FindInString(||%$(""BM_entry"");||,||<@{ }crossref@{ }=@{ }{{\{\(3+^\}\)\}}||||{""\(3+^""\)""}}||,3,4,1);> IfOK(!||GetTag(3,3);FormatString(""%!3"",3,""trimboth"");> Assign(""BM_sortCrossrefs"",""%$(''''BM_sortCrossrefs'''');{%!3}%\"");||);|> );> '',!''> LetRegNum(4,|%$(*BM_sortError*);+1|);> Assign(|BM_sortError|,|%!4|);> '');> // generate the sort key: IfStr(''%$(|bib_sortSecond|);'','''',''='',''LetRegNum(5,1);LetReg(2,||);'',''LetRegNum(5,2);'');> Assign(''BM_i'',''1'');> Repeat(%!5,!*> SetOK(1);> FindInString(''%$(|BM_entry|);'',''%$(|BM_sort%$(""BM_i"");|);'',4,5,0001);> IfOK(!''> ReplaceInString(|sortkey|,|\0|,0,100,1,|%$(""BM_i"");|);> GetTag(9,5);'',> ''LetReg(|%$(""BM_i"");|,|zzzzzzzz|);> LetReg(5,|no|);'');> // expand before sorting? // suggested by Chris Sims IfStr(''%!5'','''',''='',''> SetOK(1);> FindInString(|%%!%$(""BM_i"");|,|+{^$Numeric$}|,3,4,1);> IfOK(||,|LetReg(5,||numerical||);|);> '',''> SetOK(1);> FindInString(|%%!%$(""BM_i"");|,|#|,3,4,0);> IfOK(|LetReg(5,||||);|);''> );> IfStr(''%!5'','''',''='',!''> Assign(|BorbName|,|BM_bibGetField.edt|);> Assign(|BorbFile|,|Macros\LaTeX\bibGetField.edt|);> IfStr(|%[**%$(:Borb:);**];%$(**BM_bibGetField.edt**);|,|???|,|<>|,!''''> Assign(|BMGetField|,|expandonly|);> SetSel(0);> GetSel(1,5);> Assign(|temp0|,|%!0|);> Assign(|temp1|,|%!1|);> Assign(|temp2|,|%!2|);> Assign(|temp6|,|%!6|);> Do(|Assign(||BM_fieldValue||,||%%!%$(""BM_i"");||);|);> Exe(|%$(:BM_bibGetField.edt:);|);> LetReg(0,|%$(:temp0:);|);> LetReg(1,|%$(:temp1:);|);> LetReg(2,|%$(:temp2:);|);> LetReg(6,|%$(:temp6:);|);> IfStr(|%$(""BM_fieldValue"");|,|Error|,|=|,||,!|LetReg(||%$(""BM_i"");||,||%$(:BM_fieldValue:);||);|);''''> );''> );> // munch special characters: // thanks to J\"urgen Dix Assign(''BM_eatregular'',''1'');> Assign(''BM_spitregular'',''1'');> Assign(''BM_eat'',''\\{\(2l|i|j|o\)}{ |\{|\}}'');Assign(''BM_spit'',''\2'');Do(''%$(|BM_eatChars|);'');> Assign(''BM_spitregular'',''0'');> Assign(''BM_eat'',''{\\aa{ |\{|\}}}|[àáâãå]''); Assign(''BM_spit'',''a''); Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''[èéêë]''); Assign(''BM_spit'',''e''); Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''[ìíîï]''); Assign(''BM_spit'',''i''); Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''[òóôõ]''); Assign(''BM_spit'',''o''); Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''[ùúû]''); Assign(''BM_spit'',''u''); Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''{\\""{a|\{a\}}}|{\\ae{ |\{|\}}}|[äæ]''); Assign(''BM_spit'',''ae'');Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''{\\""{o|\{o\}}}|{\\oe{ |\{|\}}}|[öøœ]'');Assign(''BM_spit'',''oe'');Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''{\\""{u|\{u\}}}|ü''); Assign(''BM_spit'',''ue'');Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''{\\""{s|\{s\}}}|{\\ss{ |\{|\}}}|ß''); Assign(''BM_spit'',''ss'');Do(''%$(|BM_eatChars|);'');> Assign(''BM_eatregular'',''0'');> Assign(''BM_eat'',''ç''); Assign(''BM_spit'',''c''); Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''ñ''); Assign(''BM_spit'',''n''); Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''š''); Assign(''BM_spit'',''s''); Do(''%$(|BM_eatChars|);'');> Assign(''BM_eat'',''ž''); Assign(''BM_spit'',''z''); Do(''%$(|BM_eatChars|);'');> // Remove all other characters, commands, spaces and braces Assign(''BM_eat'',''\ ''); Assign(''BM_spit'','' '');Do(''%$(|BM_eatChars|);'');> Assign(''BM_eatregular'',''1'');> Assign(''BM_eat'',''{\\**^$Alpha$}|\{|\}|$[#0..#31]$|$[#127..#255]$''); Assign(''BM_spit'',''''); Do(''%$(|BM_eatChars|);'');> Assign(''BM_eatregular'',''0'');> Assign(''BM_eat'',''~''); Assign(''BM_spit'','' ''); Do(''%$(|BM_eatChars|);'');> // parse names: SetOK(1);> FindInString(''%$(|BM_sort%$(""BM_i"");|);'',''author|editor'',4,5,1);> IfOK(!''> LetRegNum(3,0);> LetRegNum(5,0);> // only consider bib_sortNrAuthors authors (suggested by Sebastien Nguyen ) LetRegNum(0,""%$(|bib_sortNrAuthors|);"");> Loop(**> IfNum(|%%!0|,|0|,|>|,!''''> SetOK(1);> FindInString(|%%!%$(""BM_i"");|,|+{<|| }AND+{ ||>}|,4,5,1001,%%!5);> IfOK(!|> ReplaceInString(||%%!%$(""BM_i"");||,|| ||,%%!4,%%!5,0,||%$(""BM_i"");||);> LetRegNum(5,||%%!5-(%%!5-%%!4)||);|,> !|GetLength(5,||%%!%$(""BM_i"");||);Stop;|> );> // the name probably already is in the correct order, if it contains a comma SetOK(1);> FindInString(|%%!%$(""BM_i"");|,|$Alpha$+{^{ ||,}},|,8,9,1011,%%!3-2);> IfNum(%%!9,%%!5-2,|<|,!||,> !|// else we move the last word to the beginning <> SetOK(1);> FindInString(:%%!%$(""BM_i"");:,:+{ }\(1$Alpha$+{^{ ||\.}}\)~{\.}:,8,9,1111,%%!5-2);> IfOK(!:> GetTag(1,4);> ReplaceInString(||%%!%$(""BM_i"");||,||||,%%!8,%%!9,1,||%$(""BM_i"");||);> InsertByIndex(||%$(""BM_i"");||,||%%!%$(""BM_i"");||,||%%!4, ||,%%!3);:> );|> );> LetRegNum(3,%%!5+2);> LetRegNum(0,%%!0-1);> '''',!''''> ExtractByIndex(|%$(""BM_i"");|,|%%!%$(""BM_i"");|,0,%%!5);> Stop;'''');**> );''> );> // normalize the string LetRegNum(5,0);> Loop(''SetOK(1);FindInString(''''%%!%$(|BM_i|);'''',''''>'''',4,5,1011,%%!5-2);> IfOK(!''''ReplaceInString(|%%!%$(|BM_i|);|,| |,%%!4,%%!5,0,|%$(""BM_i"");|);'''',''''Stop;'''');'');> Do(''FormatString(''''%%!%$(|BM_i|);'''',''''%$(""BM_i"");'''',''''lowercase whitespace trimboth'''');'');> // different order for the sort criteria? // in that case we invert numbers resp. letters (suggested by Sebastien Nguyen ) IfNum(''%$(|BM_sortOrder%$(:BM_i:);|);'',''0'',''='',!:> Do(::GetLength(3,''%%!%$(|BM_i|);'');::);> Loop(''> ExtractByIndex(4,''''%%!%$(|BM_i|);'''',%%!3,%%!3);> IfNum(%%!3,0,''''='''',''''Stop;'''');> FindInString(''''%%!4'''',''''[0-9]'''',5,5,11);> IfOK(!''''> LetRegNum(4,9-%%!4);> ReplaceInString(|%%!%$(|BM_i|);|,|%%!4|,%%!3,%%!3,0,|%$(""BM_i"");|);> '''');> FindInString(''''%%!4'''',''''[a-z]'''',5,5,11);> IfOK(!''''// this is slow... <> IfStr(|%%!4|,|z|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""a"");|);> IfStr(|%%!4|,|y|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""b"");|);> IfStr(|%%!4|,|x|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""c"");|);> IfStr(|%%!4|,|w|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""d"");|);> IfStr(|%%!4|,|v|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""e"");|);> IfStr(|%%!4|,|u|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""f"");|);> IfStr(|%%!4|,|t|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""g"");|);> IfStr(|%%!4|,|s|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""h"");|);> IfStr(|%%!4|,|r|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""i"");|);> IfStr(|%%!4|,|q|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""j"");|);> IfStr(|%%!4|,|p|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""k"");|);> IfStr(|%%!4|,|o|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""l"");|);> IfStr(|%%!4|,|n|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""m"");|);> IfStr(|%%!4|,|m|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""n"");|);> IfStr(|%%!4|,|l|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""o"");|);> IfStr(|%%!4|,|k|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""p"");|);> IfStr(|%%!4|,|j|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""q"");|);> IfStr(|%%!4|,|i|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""r"");|);> IfStr(|%%!4|,|h|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""s"");|);> IfStr(|%%!4|,|g|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""t"");|);> IfStr(|%%!4|,|f|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""u"");|);> IfStr(|%%!4|,|e|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""v"");|);> IfStr(|%%!4|,|d|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""w"");|);> IfStr(|%%!4|,|c|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""x"");|);> IfStr(|%%!4|,|b|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""y"");|);> IfStr(|%%!4|,|a|,|=|,!|LetRegNum(4,%%!3);LetReg(3,""z"");|);> ReplaceInString(|%%!%$(|BM_i|);|,|%%!3|,%%!4,%%!4,0,|%$(""BM_i"");|);> LetRegNum(3,%%!4);> '''');> LetRegNum(3,%%!3-1);> '');> :);> LetRegNum(3,''%$(|BM_i|);+1'');> Assign(''BM_i'',''%!3'');> *); // finished generating the sort key <> // Do(:Prompt(''%!1 %!2'');:);> IfStr(''%$(|BM_debug|);'',''well, yes'',''='',!:> Assign(''BM %!1 %!2%$(|BM_j|); {%$(|BM_key|);}'',''%!1 %!2%$(|BM_j|);%\%$(|BM_entry|);'');> :,!:> Assign(''BM %!1 %!2%$(|BM_j|); {%$(|BM_key|);}'',''%$(|BM_entry|);'');> :);> Assign(''BM_sortEntries'',''%$(|BM_sortEntries|);BM %!1 %!2%$(|BM_j|); {%$(|BM_key|);}%\'');> LetRegNum(6,%!6+%!7);'> );",> "Stop;");> IfStr("%$('BM %!1 %!2%$(|BM_j|); {%$(|BM_key|);}');","","=","Stop;");> EndGroup;> `); // WinEdt provides only 1,000 (5.2) resp. 10,000 (5.3) local string registers. // If there's no register left we'ld lose items. // Therefore we check whether the last variable could be assigned. IfStr("%$('BM %!1 %!2%$(|BM_j|); {%$(|BM_key|);}');","","=",> !"LetRegNum(0,'%$(|BM_j|);',0,0);> Release('BM_conf');> Release('BM_sortError');> Release('BM_sortPreamble');> SetTracking(1);> Refresh;> EndGroup;> CMD('Undo');> LetRegNum(2,-1);> Loop(!`> SetOK(1);> FindInString('%$(|BM_sortEntries|);','<{~>}*>',1,2,1011,%!2);> IfOK(!'> ExtractByIndex(1,''%$(|BM_sortEntries|);'',%!1,%!2-2);> Release(''%!1'');',> 'Stop;');> `);> Release('BM_sortEntries');> IfNum(%!0,0,'=','Prompt(|I didn''t find any bibliography entries to sort!|,3,1); Exit;');> IfStr('%_','','<>','LetReg(1,''%\With WinEdt 5.3 or later, you can sort up to 10,000 items.%\You should really consider upgrading.'');','LetReg(1,'''');');> Prompt('There are more than %!0 items in the%\bibliography database.%\That is too much for me!%\Sorry...%\%!1',3,1);> RestoreFind;> Exit;> "); StopWorking; LetRegNum(0,"%$('BM_j');",0,0); // remove old separator string CMD("Go To Beginning Of File"); Assign("BM_separator","%% ========= cross-referenced entries ========="); SetFindStr("<%$('BM_separator');>"); SearchReset; IfFound("CMD('Delete');"); // *** Sort the items: *** StartWorking("sorting entries..."); SortLines("%$('BM_sortEntries');","010%$('BM_sortOrder');",0,1); Assign("BM_sortEntries","%!1"); SortLines("%$('BM_sortCrossrefs');",1101,0,1); Assign("BM_sortCrossrefs","%!1"); // preamble GetDate(1,"dd.mm.yy 'at' hh:nn:ss"); LetReg(2,"> -*- BibTeX -*-%\> =====================================%\> This file has been sorted by%\bibSort.edt on %!1.%\%\> It includes %!0 items, sorted by"); IfStr("%$('bib_sortFirst');","KEY","=",!"> LetReg(2,'%!2 KEY');",> !"IfStr('%$(|bib_sortSecond|);','','=',!'> LetReg(2,''%!2 ""%$(|bib_sortFirst|);"".'');',> !'LetReg(2,''%!2%\""%$(|bib_sortFirst|);"" first, then by ""%$(|bib_sortSecond|);"".'');'> );"> ); IfStr("%$('BM_sortCrossrefs');","","=",> !"IfStr('%$(|bib_sortCrossrefs|);','yes','=',!'LetReg(2,''%!2%\(No cross-referenced entries.)'');');",> !"IfStr('%$(|bib_sortCrossrefs|);','yes','=',!'LetReg(2,''%!2%\(Cross-referenced entries last.)'');');"); Assign("BM_sortPreamble","%!2%\=====================================%\"); // get items from sorted list LetReg(0,""); LetRegNum(2,-1); LetReg(8,"BM_separator%\"); Loop(!`> SetOK(1);> FindInString("%$('BM_sortEntries');","<{~>}*>",1,2,1011,%!2);> IfOK(!"> ExtractByIndex(9,'%$(|BM_sortEntries|);',%!1,%!2-2);> IfStr('%$(|bib_sortCrossrefs|);','yes','=',!'> // sort cross-referenced entries last GetLength(4,''%!9'');> SetOK(1);> FindInString(''%!9'',''{'',3,3,100,%!4);> ExtractByIndex(5,''%!9'',%!3+1,%!4-2);> SetOK(1);> FindInString(''%$(|BM_sortCrossrefs|);'',''{%!5}'',6,7,0);> IfOK(!''> ReplaceInString(|%$(""BM_sortCrossrefs"");|,||,%!6,%!7+2,0,3);> Assign(|BM_sortCrossrefs|,|%!3|);> ReplaceInString(|%$(""BM_sortEntries"");|,||,%!1,%!2,0,3);> Assign(|BM_sortEntries|,|%!3%!8%!9%\|);> LetReg(2,|%!2-(%!2-%!1)|);> LetReg(8,||);'',> !''LetReg(0,|%!0%$(""%!9"");%\%\|);> Release(|%!9|);''> );',> !'LetReg(0,''%!0%$(|%!9|);%\%\'');> Release(''%!9'');'> );",> "Stop;");> `); // write the new file IfNum("%$('BM_lastLine');",999999999,"=",!`> CMD("Go To Beginning Of File");> SetFindStr("<-\*- BibTeX -\*->%_> <=====================================>%_> \(1\)**> <=====================================>+{<>}");> SearchReset;> IfFound(!"CMD('Delete');> GetTag(1,1);> InsertByIndex(1,'%$(|BM_sortPreamble|);','%!1%\',55);> Assign('BM_sortPreamble','%!1');> CMD('Go To Beginning Of File');");> SetFindStr("@{<-\*- BibTeX -\*->%_> <=====================================>}> bibSort\.edt on **> =====================================>+{<>}");> SearchReset;> Find;> InsText("%$('BM_sortPreamble');%\");> Mark(0);> Goto(1);> IfNum(%l,10,">","","Goto(0);");> InsText("%!0");> // SetFindStr("+{<>}");> // SearchReset;> // IfFound("CMD('Delete');");> SetFindStr("<>+{<>}");> SearchReset;> Loop(!"IfFound('InsText(|%\|);','Stop;');");> CMD("Go To Beginning Of File");> `,!`> Goto(1);> InsText("%!0");> SetSel(1);> Goto(1);`> ); StopWorking; RestoreFind; SetTracking(1); Refresh; EndGroup; LetReg(0,"");LetReg(1,"");LetReg(2,""); LetReg(3,"");LetReg(4,"");LetReg(5,""); LetReg(6,"");LetReg(7,"");LetReg(8,"");LetReg(9,""); Release("temp0"); Release("temp1"); Release("temp2"); Release("temp6"); Release("BM_eat"); Release("BM_eatregular"); Release("BM_spit"); Release("BM_spitregular"); Release("BM_sort1"); Release("BM_sort2"); Release("BM_sortOrder1"); Release("BM_sortOrder2"); Release("BM_sortPreamble"); Release("BM_sortEntries"); Release("BM_sortCrossrefs"); Release("BM_conf"); IfStr("%$('BM_sortError');","","<>","> Prompt('%$(|BM_sortError|); entries could not be sorted. (Matching Delimiter not found.)%\You''ll find them at the end of the file.',2,1);"); End; //============================================================================= This macro sorts a bibliography database. You will be asked for the two sort criteria. Besides the obvious "year", "crossref", etc., you can also put something like "author|editor" in there, which means "author OR editor" (using WinEdt's Regular Expressions). Furthermore, there are two special keys: * "KEY" is the cite key (i.e. the key you \cite, not the "key" field). * "TYPE" means the type of entry (e.g. "BOOK", "ARTICLE", etc.). These two keys are case-sensitive, the rest is not. You can leave the second sort criterion empty, which will make sorting faster. For each criterion, you can choose the sorting order. Also, you can specify the number of authors resp. editors relevant for sorting. If a field is empty it will be sorted after the other entries. If entries have the same key (for this macro), they will be sorted according to their original order. Everything that is not inside a bibliography item will be put at the end of the file, except for stuff that appears before the first item which will stay where it is. @STRINGs and @PREAMBLEs are excluded from sorting. If you are not using this macro as a part of the bibMacros package (see ), you'll at least miss the feature of strings being expanded before sorting. If you have the MUI Plug-In installed (available from ) you will see a nice dialog. Otherwise it will be two simple edit boxes. R Schlicht //============================================================================= $Id: bibSort54.edt,v 1.1 2007-06-07 00:17:30+02 schlicht Exp schlicht $