You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1849 lines
43 KiB

  1. %%
  2. %% This is file `svn-multi.sty',
  3. %% generated with the docstrip utility.
  4. %%
  5. %% The original source files were:
  6. %%
  7. %% svn-multi.dtx (with options: `package')
  8. %%
  9. %% This is a generated file.
  10. %%
  11. %% Copyright (C) 2006-2009 by Martin Scharrer <martin@scharrer-online.de>
  12. %%
  13. %% This work may be distributed and/or modified under the
  14. %% conditions of the LaTeX Project Public License, either version 1.3
  15. %% of this license or (at your option) any later version.
  16. %% The latest version of this license is in
  17. %% http://www.latex-project.org/lppl.txt
  18. %% and version 1.3 or later is part of all distributions of LaTeX
  19. %% version 2005/12/01 or later.
  20. %%
  21. %% This work has the LPPL maintenance status `maintained'.
  22. %%
  23. %% The Current Maintainer of this work is Martin Scharrer.
  24. %%
  25. %% This work consists of the files svn-multi.dtx, svn-multi-pl.dtx, svn-multi.ins
  26. %% and the derived files svn-multi.sty, svnkw.sty and svn-multi.pl.
  27. %%
  28. \makeatletter
  29. \def\svnmulti@version{v2.3}
  30. \RequirePackage{svn-prov}
  31. \NeedsTeXFormat{LaTeX2e}[1999/12/01]
  32. \ProvidesPackageSVN
  33. {$Id: svn-multi.dtx 1866 2010-07-19 11:17:15Z martin $}
  34. [\svnmulti@version\space SVN Keywords for multi-file LaTeX documents]
  35. \RequirePackage{kvoptions}
  36. \SetupKeyvalOptions{%
  37. family = svn-multi,
  38. prefix = @svnmulti@
  39. }
  40. \newif\if@svnmulti@anygraphic
  41. \newif\if@svnmulti@autoload
  42. \newif\if@svnmulti@autokw
  43. \newif\if@svnmulti@autokwall
  44. \DeclareVoidOption{old}{%
  45. \@svnmulti@verbatimtrue
  46. \@svnmulti@groupsfalse
  47. \@svnmulti@externalfalse
  48. \@svnmulti@graphicsfalse
  49. \@svnmulti@pgfimagesfalse
  50. \@svnmulti@autoloadfalse
  51. \@svnmulti@tablefalse
  52. \@svnmulti@filehooksfalse
  53. \@svnmulti@subgroupsfalse
  54. }
  55. \DeclareVoidOption{all}{%
  56. \@svnmulti@verbatimtrue
  57. \@svnmulti@groupstrue
  58. \@svnmulti@externaltrue
  59. \@svnmulti@graphicstrue
  60. \@svnmulti@pgfimagestrue
  61. \@svnmulti@autoloadtrue
  62. \@svnmulti@tabletrue
  63. \@svnmulti@filehookstrue
  64. \@svnmulti@subgroupstrue
  65. }
  66. \DeclareBoolOption[true]{verbatim}
  67. \DeclareBoolOption[false]{groups}
  68. \DeclareBoolOption[false]{external}
  69. \DeclareBoolOption[false]{subgroups}
  70. \DeclareBoolOption[false]{graphics}
  71. \DeclareBoolOption[false]{pgfimages}
  72. \DeclareStringOption{autoload}[true]
  73. \DeclareBoolOption[false]{table}
  74. \DeclareBoolOption[false]{filehooks}
  75. \DeclareStringOption[false]{autokw}[all]
  76. \ExecuteOptions{old}
  77. \ProcessKeyvalOptions{svn-multi}
  78. \def\svn@depoption#1{%
  79. \csname if@svnmulti@#1\endcsname\else
  80. \message{svn-multi: Required option '#1' enabled.}%
  81. \csname @svnmulti@#1true\endcsname
  82. \fi
  83. }
  84. \if@svnmulti@groups
  85. \svn@depoption{filehooks}
  86. \fi
  87. \if@svnmulti@external
  88. \svn@depoption{filehooks}
  89. \fi
  90. \if@svnmulti@subgroups
  91. \svn@depoption{groups}
  92. \svn@depoption{filehooks}
  93. \fi
  94. \if@svnmulti@graphics
  95. \svn@depoption{external}
  96. \svn@depoption{autoload}
  97. \svn@depoption{filehooks}
  98. \fi
  99. \if@svnmulti@pgfimages
  100. \svn@depoption{external}
  101. \svn@depoption{autoload}
  102. \svn@depoption{filehooks}
  103. \fi
  104. \if@svnmulti@autoload
  105. \svn@depoption{external}
  106. \svn@depoption{filehooks}
  107. \fi
  108. \if@svnmulti@table
  109. \svn@depoption{groups}
  110. \svn@depoption{filehooks}
  111. \fi
  112. \ifx\@svnmulti@autoload\@undefined
  113. \else
  114. \ifx\@svnmulti@autoload\empty
  115. \else
  116. \def\svn@temp{true}
  117. \ifx\@svnmulti@autoload\svn@temp
  118. \@svnmulti@autoloadtrue
  119. \svn@depoption{external}
  120. \svn@depoption{filehooks}
  121. \else
  122. \def\svn@temp{false}
  123. \ifx\@svnmulti@autoload\svn@temp
  124. \if@svnmulti@autoload
  125. \PackageWarning{svn-multi}{Option 'autoload' disabled.}
  126. \fi
  127. \@svnmulti@autoloadfalse
  128. \else
  129. \PackageError{svn-multi}%
  130. {Invalid value for 'autoload' option: '\@svnmulti@autoload'^^J%
  131. ! Only 'true','false' or empty (='true') are allowed!}
  132. \fi\fi\fi\fi
  133. \def\svn@temp{true}
  134. \ifx\@svnmulti@autokw\svn@temp
  135. \@svnmulti@autokwtrue
  136. \@svnmulti@autokwalltrue
  137. \svn@depoption{filehooks}
  138. \fi
  139. \def\svn@temp{all}
  140. \ifx\@svnmulti@autokw\svn@temp
  141. \@svnmulti@autokwtrue
  142. \@svnmulti@autokwalltrue
  143. \svn@depoption{filehooks}
  144. \fi
  145. \def\svn@temp{ext}
  146. \ifx\@svnmulti@autokw\svn@temp
  147. \@svnmulti@autokwtrue
  148. \@svnmulti@autokwallfalse
  149. \fi
  150. \def\svn@temp{false}
  151. \ifx\@svnmulti@autokw\svn@temp
  152. \@svnmulti@autokwfalse
  153. \@svnmulti@autokwallfalse
  154. \fi
  155. \if@svnmulti@graphics
  156. \@svnmulti@anygraphictrue
  157. \fi
  158. \if@svnmulti@pgfimages
  159. \@svnmulti@anygraphictrue
  160. \fi
  161. \def\svn@ifempty#1{%
  162. \begingroup
  163. \edef\svn@temp{#1}%
  164. \ifx\svn@temp\empty
  165. \endgroup
  166. \expandafter
  167. \@firstoftwo
  168. \else
  169. \endgroup
  170. \expandafter
  171. \@secondoftwo
  172. \fi
  173. }
  174. \def\svn@ifequal#1#2{%
  175. \begingroup
  176. \edef\svn@stringa{#1}%
  177. \edef\svn@stringb{#2}%
  178. \ifx\svn@stringa\svn@stringb
  179. \endgroup
  180. \expandafter
  181. \@firstoftwo
  182. \else
  183. \endgroup
  184. \expandafter
  185. \@secondoftwo
  186. \fi
  187. }
  188. \def\svn@ifvalidrev#1{%
  189. \begingroup
  190. \@ifundefined{#1}%
  191. {\let\svn@temp\svn@revinit}%
  192. {\expandafter\edef
  193. \expandafter\svn@temp\expandafter{\csname #1\endcsname}}%
  194. \ifnum\svn@temp=\svn@revinit\relax
  195. \endgroup
  196. \expandafter
  197. \@secondoftwo
  198. \else
  199. \endgroup
  200. \expandafter
  201. \@firstoftwo
  202. \fi
  203. }
  204. \def\svn@ifeof#1{%
  205. \ifeof#1%
  206. \expandafter\@firstoftwo
  207. \else
  208. \expandafter\@secondoftwo
  209. \fi
  210. }
  211. \def\svn@ifonlyone#1{%
  212. \expandafter\expandafter\expandafter
  213. \svn@@ifonlyone\csname @svng@#1@files\endcsname,\relax
  214. }
  215. \def\svn@@ifonlyone#1,#2\relax{%
  216. \svn@ifempty{#2}
  217. }
  218. \def\svn@input#1{%
  219. \begingroup
  220. \let\svn@rg\svn@g
  221. \IfFileExists{#1}{\@@input #1\relax}{}%
  222. \global\let\svn@g\svn@rg
  223. \endgroup
  224. }
  225. \def\svn@inputsvx#1{%
  226. \svn@pushfilestack
  227. \begingroup
  228. \svn@normalcatcodes
  229. \svn@input{#1.svx}%
  230. \endgroup
  231. \svn@popfilestack
  232. }
  233. \def\svn@normalcatcodes{%
  234. \catcode`\\=0\relax
  235. \catcode`\{=1\relax
  236. \catcode`\}=2\relax
  237. \catcode`\$=3\relax
  238. \catcode`\&=4\relax
  239. \catcode`\^^M=5\relax
  240. \catcode`\#=6\relax
  241. \catcode`\^=7\relax
  242. \catcode`\_=8\relax
  243. \catcode`\ =10\relax
  244. \catcode`\@=12\relax
  245. \catcode`\~=13\relax
  246. \catcode`\%=14\relax
  247. }
  248. \def\svn@revinit{-2}
  249. \let\svnrev\svn@revinit \let\@svn@rev\svn@revinit
  250. \let\ifsvnmodified\@secondoftwo
  251. \def\@svn@modified{@secondoftwo}%
  252. \def\svndate{} \def\@svn@date{}
  253. \def\svnauthor{} \def\@svn@author{}
  254. \def\svnyear{0000} \def\@svn@year{0000}
  255. \def\svnmonth{00} \def\@svn@month{00}
  256. \def\svnday{00} \def\@svn@day{00}
  257. \def\svnhour{00} \def\@svn@hour{00}
  258. \def\svnminute{00} \def\@svn@minute{00}
  259. \def\svnsecond{00} \def\@svn@second{00}
  260. \def\svntimezonehour{+00} \def\@svn@timezonehour{+00}
  261. \def\svntimezoneminute{00} \def\@svn@timezoneminute{00}
  262. \def\svnmainurl{NOT SET} \def\svnmainfilename{NOT SET}
  263. \def\svnurl{} \def\svnfname{}
  264. \def\svn@temp{}
  265. \def\svn@pg{} \def\svn@g{} \def\svn@cg{\svn@g} \def\svn@rg{\svn@pg}
  266. \let\@svng@@files\relax
  267. \def\svn@initfile{%
  268. \global\let\svnfilerev\svn@revinit
  269. \global\let\ifsvnfilemodified\@secondoftwo
  270. \gdef\svnfiledate{}%
  271. \gdef\svnfileauthor{}%
  272. \gdef\svnfileyear{0000}%
  273. \gdef\svnfilemonth{00}%
  274. \gdef\svnfileday{00}%
  275. \gdef\svnfilehour{00}%
  276. \gdef\svnfileminute{00}%
  277. \gdef\svnfilesecond{00}%
  278. \gdef\svnfiletimezonehour{+00}%
  279. \gdef\svnfiletimezoneminute{00}%
  280. \gdef\svnfileurl{}%
  281. \gdef\svnfilefname{}%
  282. \gdef\svnfiledir{}%
  283. }
  284. \svn@initfile
  285. \newif\ifsvn@modified
  286. \begingroup
  287. \@makeother\^^L
  288. \if@svnmulti@autokw
  289. \gdef\svne@ff{^^L}
  290. \fi
  291. \endgroup
  292. \if@svnmulti@autokw
  293. \newread\svne@read
  294. \newcommand*{\svne@catcodes}{%
  295. \let\do\@makeother
  296. \endlinechar=-1%
  297. \dospecials
  298. \do\-\do\:\do\.\do\^^L%
  299. }
  300. \def\svne@readline#1{%
  301. \ifeof\svne@read
  302. \def#1{}%
  303. \else
  304. \read\svne@read to #1\relax
  305. \fi
  306. }
  307. \def\svne@gobblerest{%
  308. \ifeof\svne@read
  309. \let\next\relax
  310. \else
  311. \read\svne@read to \svn@temp
  312. \ifx\svn@temp\svne@ff
  313. \let\next\relax
  314. \else
  315. \let\next\svne@gobblerest
  316. \fi
  317. \fi
  318. \next
  319. }
  320. \def\svne@endread{%
  321. \closein\svne@read
  322. }
  323. \newcommand*{\svne@parseentriesfile}[1]{%
  324. \begingroup
  325. \let\next\relax
  326. \def\svne@version{8}%
  327. \openin\svne@read=#1format\relax
  328. \ifeof\svne@read\else
  329. \svne@readline\svne@version
  330. \closein\svne@read
  331. \fi
  332. \ifnum\svne@version>7\relax
  333. \openin\svne@read=#1entries\relax
  334. \ifeof\svne@read\else
  335. \svne@catcodes
  336. \svne@readline\svne@version
  337. \ifnum\svne@version>7\relax
  338. \def\next{\svne@parsedirentry
  339. \svne@parseentries}%
  340. \else
  341. \closein\svne@read
  342. \fi
  343. \fi
  344. \fi
  345. \next
  346. \endgroup
  347. }
  348. \newcommand*{\svne@parsedirentry}{%
  349. \svne@readline\svne@name
  350. \svne@readline\svne@kind
  351. \svn@ifempty{\svne@name}%
  352. {\svn@ifequal{\svne@kind}{dir}%
  353. {%
  354. {\svne@readline\svn@temp}%
  355. \svne@readline\svne@baseurl
  356. \svne@gobblerest
  357. }{}%
  358. }{}%
  359. }
  360. \begingroup
  361. \@makeother\-
  362. \@makeother\:
  363. \@makeother\.
  364. \gdef\svne@scandate#1{%
  365. \expandafter\svne@scandate@#1\empty
  366. 0000-00-00T00:00:00.00000Z\empty\empty
  367. }
  368. \gdef\svne@scandate@#1-#2-#3T#4:#5:#6.#7\empty#8\empty{%
  369. \xdef\svnfileyear{#1}%
  370. \gdef\svnfilemonth{#2}%
  371. \gdef\svnfileday{#3}%
  372. \gdef\svnfilehour{#4}%
  373. \gdef\svnfileminute{#5}%
  374. \gdef\svnfilesecond{#6}%
  375. \gdef\svnfiletimezonehour{+00}%
  376. \gdef\svnfiletimezoneminute{00}%
  377. \gdef\svnfiledate{#1-#2-#3 #4:#5:#6Z}%
  378. \def\svne@date{#1-#2-#3 #4:#5:#6Z}%
  379. }
  380. \endgroup
  381. \newcommand*{\svne@parseentries}{%
  382. \svn@ifeof{\svne@read}%
  383. {}%
  384. {%
  385. \svne@readline\svne@name
  386. \@onelevel@sanitize\svne@name
  387. \svn@ifeof{\svne@read}%
  388. {}%
  389. {%
  390. \svne@readline\svne@kind
  391. \svn@ifequal{\svne@kind}{file}%
  392. {%
  393. \svne@readline\svn@temp
  394. \svne@readline\svn@temp
  395. \svne@readline\svn@temp
  396. \svne@readline\svn@temp
  397. \svne@readline\svn@temp
  398. \svne@readline\svn@temp
  399. \svne@readline\svne@date
  400. \svne@readline\svne@rev
  401. \svne@readline\svne@author
  402. %\@onelevel@sanitize\svne@date
  403. \svne@scandate{\svne@date}%
  404. \edef\svne@url{\svne@baseurl/\svne@name}%
  405. \svne@handleentry
  406. }{}%
  407. \svne@gobblerest
  408. \svne@parseentries
  409. }%
  410. }%
  411. }
  412. \def\svne@handleentry{%
  413. \ifx\svne@rev\empty
  414. \let\svne@rev\svn@revinit
  415. \fi
  416. \svn@ifequal{\svne@name}{\svnfilefname}%
  417. {%
  418. \message{^^J%
  419. Read from '.svn/entries' file:^^J%
  420. Filename: \svne@name^^J%
  421. Date: \svne@date^^J%
  422. Revision: \svne@rev^^J%
  423. Author: \svne@author^^J%
  424. HeadURL: \svne@url^^J%
  425. ^^J%
  426. }%
  427. \svnkwdef{Filename}{\svne@name}%
  428. \svnkwdef{Date}{\svne@date}%
  429. \svnkwdef{Revision}{\svne@rev}%
  430. \svnkwdef{Author}{\svne@author}%
  431. \svnkwdef{HeadURL}{\svne@url}%
  432. \@svn@updateid{\svne@rev}{\svne@date}{\svne@author}{\svne@url}%
  433. \svne@endread
  434. }{}%
  435. }%
  436. \def\svnegetfile#1{%
  437. \begingroup
  438. \svn@getfilename{#1}%
  439. \edef\svnfilefname{\svnfilefname}%
  440. \@onelevel@sanitize\svnfilefname
  441. \svne@parseentriesfile{\svnfiledir .svn/}%
  442. \svne@parseentriesfile{\svnfiledir _svn/}%
  443. \endgroup
  444. }
  445. \if@svnmulti@autokwall
  446. \AtBeginDocument{%
  447. \svnegetfile{\jobname.\svn@mainext}%
  448. }
  449. \fi
  450. \fi
  451. \def\svntimezone{\svntimezonehour\svntimezoneminute\svn@gobblezeros}
  452. \def\svnfiletimezone{\svnfiletimezonehour\svnfiletimezoneminute\svn@gobblezeros}
  453. \def\svncgtimezone{\svncgtimezonehour\svncgtimezoneminute}
  454. \def\svn@gobblezeros{%
  455. \futurelet\svn@nextchar\svn@gobblezeros@
  456. }
  457. \def\svn@gobblezeros@{%
  458. \let\@tempa=\relax
  459. \def\@tempb{0}%
  460. \ifx0\svn@nextchar
  461. \let\@tempa=\@gobbletwo
  462. \fi
  463. \@tempa
  464. }
  465. \def\svntime{\svnhour:\svnminute:\svnsecond}
  466. \def\svnfiletime{\svnfilehour:\svnfileminute:\svnfilesecond}
  467. \def\svncgtime{\svncghour:\svncgminute:\svncgsecond}
  468. \newcommand*{\svntoday}{%
  469. \begingroup
  470. \year\svnyear \month\svnmonth \day\svnday
  471. \relax \today
  472. \endgroup
  473. }
  474. \newcommand*{\svnfiletoday}{%
  475. \begingroup
  476. \year\svnfileyear \month\svnfilemonth \day\svnfileday
  477. \relax \today
  478. \endgroup
  479. }
  480. \newcommand*{\svncgtoday}{%
  481. \@ifundefined{svng@\svn@cg @year}{??}{%
  482. \begingroup
  483. \year\svncgyear \month\svncgmonth \day\svncgday
  484. \relax \today
  485. \endgroup
  486. }%
  487. }%
  488. \newcommand*{\svnid}{%
  489. \@svnidswtrue
  490. \svnkwsave
  491. }
  492. \newif\if@svnidsw
  493. \@svnidswfalse
  494. \def\svn@scanId#1 #2 #3 #4 #5\relax{%
  495. \@svn@scandate{#3 #4}%
  496. \@svn@updateid{#2}{#3 #4}{#5}{#1}%
  497. \svnkwdef{Filename}{#1}%
  498. \svnkwdef{Date}{#3 #4}%
  499. \svnkwdef{Revision}{#2}%
  500. \svnkwdef{Author}{#5}%
  501. }
  502. \def\@svn@updateid#1#2#3#4{%
  503. \xdef\svnfilerev{#1}%
  504. \ifsvn@modified
  505. \global\let\ifsvnfilemodified\@firstoftwo
  506. \else
  507. \global\let\ifsvnfilemodified\@secondoftwo
  508. \fi
  509. \xdef\svnfiledate{#2}%
  510. \xdef\svnfileauthor{#3}%
  511. \xdef\svnfileurl{#4}%
  512. \svn@getfilename\svnfileurl%
  513. \ifx\svnfilerev\empty\else
  514. \ifnum\@svn@rev<\svnfilerev
  515. \xdef\@svn@rev{\svnfilerev}%
  516. \xdef\@svn@modified{\ifsvnfilemodified{@firstoftwo}{@secondoftwo}}%
  517. \xdef\@svn@date{\svnfiledate}%
  518. \xdef\@svn@author{\svnfileauthor}%
  519. \xdef\@svn@year{\svnfileyear}%
  520. \xdef\@svn@month{\svnfilemonth}%
  521. \xdef\@svn@day{\svnfileday}%
  522. \xdef\@svn@hour{\svnfilehour}%
  523. \xdef\@svn@minute{\svnfileminute}%
  524. \xdef\@svn@second{\svnfilesecond}%
  525. \xdef\@svn@timezonehour{\svnfiletimezonehour}%
  526. \xdef\@svn@timezoneminute{\svnfiletimezoneminute}%
  527. \xdef\@svn@url{\svnfileurl}%
  528. \xdef\@svn@fname{\svnfilefname}%
  529. \fi
  530. \if@svnmulti@groups
  531. \ifx\svn@g\empty\else
  532. \svn@updategroup{\svn@g}%
  533. \fi
  534. \if@svnmulti@subgroups
  535. \ifsvnsubgroups
  536. \svn@updategroup{\svn@filedir\svn@filebase}%
  537. \fi
  538. \fi
  539. \fi
  540. \fi
  541. }
  542. \def\@svncg@save#1#2{%
  543. \expandafter\xdef\csname @svng@\svn@g @#1\endcsname{#2}%
  544. }
  545. \newcommand{\svnidlong}{%
  546. \svnkwdef{URL}{}%
  547. \svnkwdef{Date}{}%
  548. \svnkwdef{Revision}{0}%
  549. \svnkwdef{Author}{}%
  550. \if@svnmulti@verbatim
  551. \expandafter\svnidlong@readverb
  552. \else
  553. \expandafter\svnidlong@readargs
  554. \fi
  555. }
  556. \def\svnidlong@readverb{%
  557. \@ifnextchar\bgroup
  558. {\svnidlong@readverb@\svnidlong@readverb@a}%
  559. {\PackageError{svn-multi}{Wrong syntax for \string\svnidlong}{}}%
  560. }
  561. \def\svnidlong@readverb@#1{%
  562. \begingroup
  563. \svn@catcodes
  564. \catcode`\{=1\relax
  565. \catcode`\}=2\relax
  566. #1%
  567. }
  568. \def\svnidlong@readverb@a#1{%
  569. \endgroup
  570. \svnkwsave@read #1\relax
  571. \@ifnextchar\bgroup
  572. {\svnidlong@readverb@\svnidlong@readverb@b}%
  573. {\PackageError{svn-multi}{Wrong syntax for \string\svnidlong}{}}%
  574. }
  575. \def\svnidlong@readverb@b#1{%
  576. \endgroup
  577. \svnkwsave@read #1\relax
  578. \@ifnextchar\bgroup
  579. {\svnidlong@readverb@\svnidlong@readverb@c}%
  580. {\PackageError{svn-multi}{Wrong syntax for \string\svnidlong}{}}%
  581. }
  582. \def\svnidlong@readverb@c#1{%
  583. \endgroup
  584. \svnkwsave@read #1\relax
  585. \@ifnextchar\bgroup
  586. {\svnidlong@readverb@\svnidlong@readverb@d}%
  587. {\PackageError{svn-multi}{Wrong syntax for \string\svnidlong}{}}%
  588. }
  589. \def\svnidlong@readverb@d#1{%
  590. \endgroup
  591. \svnkwsave@read #1\relax
  592. \ifx\svnkwDate\empty\else
  593. \@svn@scanlongdate{\svnkwDate}%
  594. \fi
  595. \@svn@updateid{\svnkw{Revision}}{\svnkw{Date}}%
  596. {\svnkw{Author}}{\svnkw{URL}}%
  597. \ignorespaces
  598. }
  599. \if@svnmulti@verbatim
  600. \def\svn@catcodes{%
  601. \let\do\@makeother
  602. \dospecials
  603. \catcode`\^^M9
  604. \catcode`\ 10
  605. \catcode`\{1
  606. \catcode`\}2
  607. }
  608. \else
  609. \def\svn@catcodes{}
  610. \fi
  611. \def\svnidlong@readargs#1#2#3#4{%
  612. \svnkwsave@read #1\relax
  613. \svnkwsave@read #2\relax
  614. \svnkwsave@read #3\relax
  615. \svnkwsave@read #4\relax
  616. \endgroup
  617. \ifx\svnkwDate\empty\else
  618. \@svn@scanlongdate{\svnkwDate}%
  619. \fi
  620. \@svn@updateid{\svnkw{Revision}}{\svnkw{Date}}%
  621. {\svnkw{Author}}{\svnkw{URL}}%
  622. \ignorespaces
  623. }%
  624. \def\svnkwsave{%
  625. \begingroup
  626. \svn@catcodes
  627. \svnkwsave@readargs
  628. }
  629. \gdef\svnkwsave@readargs#1{%
  630. \svnkwsave@read#1\relax
  631. \endgroup
  632. \if@svnidsw
  633. \ifx\svnkwId\empty\else
  634. \expandafter
  635. \svn@scanId\svnkwId\relax
  636. \@svnidswfalse
  637. \fi
  638. \fi
  639. \ignorespaces
  640. }
  641. \begingroup
  642. \if@svnmulti@verbatim
  643. \catcode`\$=12
  644. \fi
  645. \gdef\svnkwsave@read $#1$\relax{%
  646. \svn@checkcolon#1:\relax
  647. }
  648. \endgroup
  649. \begingroup
  650. \catcode`\$=11
  651. \gdef\svnkwsave@parse$#1:#2${%
  652. \expandafter\xdef\csname svnkw#1\endcsname{#2}%
  653. }%
  654. \endgroup
  655. \newcommand{\svnkwdef}[2]{%
  656. \@ifundefined{svnkwdef@#1}%
  657. {\svnkwdef@{#1}{#2}}%
  658. {\csname svnkwdef@#1\endcsname{#2}}%
  659. }
  660. \newcommand{\svnkwdef@}[2]{%
  661. \expandafter\xdef\csname svnkw#1\endcsname{#2}%
  662. }
  663. \def\svnkwdef@Rev#1{%
  664. \svn@ifempty{#1}%
  665. {\svnkwdef@{Rev}{0}}%
  666. {%
  667. \afterassignment\svnkwdef@Rev@
  668. \@tempcnta=#1\relax
  669. }%
  670. }
  671. \def\svnkwdef@Rev@#1\relax{%
  672. \svnkwdef@{Rev}{\the\@tempcnta}%
  673. \def\svn@temp{#1}%
  674. \if M\svn@temp\relax
  675. \global\svn@modifiedtrue
  676. \else
  677. \if *\svn@temp\relax
  678. \global\svn@modifiedtrue
  679. \else
  680. \global\svn@modifiedfalse
  681. \fi
  682. \fi
  683. }
  684. \def\svnkwdef@Author#1{\svnkwdef@{Author}{#1}}
  685. \def\svnkwdef@Date#1{\svnkwdef@{Date}{#1}}
  686. \def\svnkwdef@URL#1{\svnkwdef@{HeadURL}{#1}}
  687. \let\svnkwdef@Revision=\svnkwdef@Rev
  688. \let\svnkwdef@LastChangedRevision=\svnkwdef@Rev
  689. \let\svnkwdef@LastChangedBy=\svnkwdef@Author
  690. \let\svnkwdef@LastChangedDate=\svnkwdef@Date
  691. \def\svnkwRevision{\svnkwRev}
  692. \def\svnkwLastChangedRevision{\svnkwRev}
  693. \def\svnkwLastChangedBy{\svnkwAuthor}
  694. \def\svnkwLastChangedDate{\svnkwDate}
  695. \def\svnkwURL{\svnkwHeadURL}
  696. \svnkwdef{Rev}{0}
  697. \svnkwdef{Date}{}
  698. \svnkwdef{Author}{}
  699. \svnkwdef{Filename}{}
  700. \svnkwdef{HeadURL}{}
  701. \newcommand{\svnkw}[1]{%
  702. \@ifundefined{svnkw#1}%
  703. {\PackageWarning{svn-multi}{SVN keyword '#1' not defined (typo?)}}%
  704. {\csname svnkw#1\endcsname}%
  705. }%
  706. \def\svn@checkcolon#1:#2\relax{%
  707. \svn@ifempty{#2}%
  708. {\svnkwdef{#1}{}}%
  709. {\svn@stripcolon#2\relax\svnkwdef{#1}{\svn@value}}%
  710. }
  711. \def\svn@stripcolon#1:\relax{%
  712. \svn@ifempty{#1}%
  713. {\gdef\svn@value{}}%
  714. {\svn@ifequal{#1}{ }%
  715. {\gdef\svn@value{}}%
  716. {\svn@stripspace#1\relax\relax}%
  717. }%
  718. }
  719. \def\svn@stripspace#1#2\relax{%
  720. \svn@ifequal{#1}{ }%
  721. {\gdef\svn@value{#2}}%
  722. {\svn@striptrailingspace#1#2\relax}%
  723. }
  724. \def\svn@striptrailingspace#1 \relax{%
  725. \gdef\svn@value{#1}%
  726. }
  727. \def\svn@gdefverb#1{%
  728. \begingroup
  729. \def\svn@temp{#1}%
  730. \begingroup
  731. \if@svnmulti@verbatim
  732. \svn@catcodes
  733. \fi
  734. \svn@gdefverb@
  735. }
  736. \def\svn@gdefverb@#1{%
  737. \endgroup
  738. \expandafter\gdef\svn@temp{#1}%
  739. \endgroup
  740. }
  741. \def\svn@namegdefverb#1{%
  742. \begingroup
  743. \expandafter\def
  744. \expandafter\svn@temp
  745. \expandafter{\csname #1\endcsname}%
  746. \begingroup
  747. \if@svnmulti@verbatim
  748. \svn@catcodes
  749. \fi
  750. \svn@gdefverb@
  751. }
  752. \def\@svn@scandate#1{\@svn@scandate@#1\relax}
  753. \def\@svn@scandate@#1-#2-#3 #4:#5:#6#7#8\relax{%
  754. \gdef\svnfileyear{#1}%
  755. \gdef\svnfilemonth{#2}%
  756. \gdef\svnfileday{#3}%
  757. \gdef\svnfilehour{#4}%
  758. \gdef\svnfileminute{#5}%
  759. \gdef\svnfilesecond{#6#7}%
  760. \gdef\svnfiletimezonehour{+00}%
  761. \gdef\svnfiletimezoneminute{00}% #8 always 'Z' for Zulu-time (UTC)
  762. }
  763. \def\@svn@scanlongdate#1{\expandafter\@svn@scanlongdate@#1\relax}
  764. \def\@svn@scanlongdate@#1-#2-#3 #4:#5:#6 #7 #8\relax{%
  765. \gdef\svnfileyear{#1}%
  766. \gdef\svnfilemonth{#2}%
  767. \gdef\svnfileday{#3}%
  768. \gdef\svnfilehour{#4}%
  769. \gdef\svnfileminute{#5}%
  770. \gdef\svnfilesecond{#6}%
  771. \@svn@parsetimezone#7\relax%
  772. }
  773. \def\@svn@parsetimezone#1#2#3#4#5\relax{%
  774. \gdef\svnfiletimezonehour{#1#2#3}%
  775. \gdef\svnfiletimezoneminute{#4#5}%
  776. }
  777. \def\svnpdfdate{%
  778. \svnyear\svnmonth\svnday
  779. \svnhour\svnminute\svnsecond\svntimezonehour'\svntimezoneminute'%
  780. }
  781. \newcommand{\svnsetmainfile}{%
  782. \xdef\svnmainurl{\svnfileurl}%
  783. \xdef\svnmainfilename{\svnfilefname}%
  784. }
  785. \AtBeginDocument{\svnsetmainfile}
  786. \newcommand{\svnRegisterAuthor}[2]{%
  787. \expandafter\def\csname svn@author@#1\endcsname{#2}%
  788. }
  789. \newcommand{\svnFullAuthor}{%
  790. \@ifnextchar{*}%
  791. {\svnFullAuthor@star}%
  792. {\svnFullAuthor@normal}%
  793. }%
  794. \def\svnFullAuthor@star*#1{%
  795. \edef\svn@temp{#1}%
  796. \svnFullAuthor@{\svn@temp}{~(\svn@temp)}%
  797. }%
  798. \def\svnFullAuthor@normal#1{%
  799. \edef\svn@temp{#1}%
  800. \svnFullAuthor@{\svn@temp}{}%
  801. }%
  802. \def\svnFullAuthor@#1#2{%
  803. \@ifundefined{svn@author@#1}%
  804. {#1}%
  805. {\csname svn@author@#1\endcsname #2}%
  806. }
  807. \newcommand{\svnRegisterRevision}[2]{%
  808. \expandafter\def\csname svn@revision@#1\endcsname{#2}%
  809. }
  810. \newcommand{\svnFullRevision}{%
  811. \@ifnextchar{*}%
  812. {\svnFullRevision@star}%
  813. {\svnFullRevision@normal}%
  814. }
  815. \def\svnFullRevision@star*#1{%
  816. \edef\svn@temp{#1}%
  817. \svnFullRevision@{\svn@temp}{~(r\svn@temp)}%
  818. }
  819. \def\svnFullRevision@normal#1{%
  820. \edef\svn@temp{#1}%
  821. \svnFullRevision@{\svn@temp}{}%
  822. }
  823. \def\svnFullRevision@#1#2{%
  824. \@ifundefined{svn@revision@#1}%
  825. {Revision #1}%
  826. {\csname svn@revision@#1\endcsname #2}%
  827. }
  828. \if@svnmulti@filehooks
  829. \RequirePackage{fink}[2008/02/27]
  830. \begingroup
  831. \def\svn@finkerror{%
  832. \PackageError{svn-multi}{Your installed version of the 'fink' package does not
  833. provide the needed macros. It is either too old or too new.
  834. Try a different version, e.g. v2.1.1 from 2008/02/27}{}%
  835. \let\svn@finkerror\relax
  836. }
  837. \@ifundefined{finkpath}{\svn@finkerror}{}%
  838. \@ifundefined{finkdir}{\svn@finkerror}{}%
  839. \@ifundefined{finkbase}{\svn@finkerror}{}%
  840. \@ifundefined{fink@prepare}{\svn@finkerror}{}%
  841. \@ifundefined{fink@restore}{\svn@finkerror}{}%
  842. \@ifundefined{fnk@maindir}{\svn@finkerror}{}%
  843. \@ifundefined{fnk@mainext}{\svn@finkerror}{}%
  844. \endgroup
  845. \def\svn@removedotslash#1{%
  846. \def\svn@removedotslash@##1##2##3\relax{%
  847. \svn@ifequal{./}{##1##2}%
  848. {\def\next{\svn@removedotslash@##3\empty\empty\empty\relax}}%
  849. {\xdef#1{##1##2##3}\let\next\relax}%
  850. \next
  851. }%
  852. \expandafter\svn@removedotslash@#1\empty\empty\empty\relax
  853. }
  854. \let\svn@mainext\fnk@mainext
  855. \let\svn@maindir\fnk@maindir
  856. \svn@removedotslash\svn@maindir
  857. \edef\svn@filebase{\jobname}%
  858. \edef\svn@fileext{\svn@mainext}%
  859. \edef\svn@filedir{\svn@maindir}%
  860. \def\svn@filename{\fink@file\svn@filebase\svn@fileext}%
  861. \def\svn@filepath{\svn@filedir\svn@filename}%
  862. \def\svnmulti@begininputfilehook{}
  863. \message{Package svn-multi: patching macro '\string\fink@prepare' from the
  864. 'fink' package!}%
  865. \let\svnmulti@fink@prepare\fink@prepare
  866. \renewcommand*{\fink@prepare}[1]{%
  867. \svnmulti@fink@prepare{#1}%
  868. \svn@pushfilestack
  869. \if@svnmulti@groups
  870. \svn@ifequal{\svn@filepath}{\jobname.\svn@mainext}%
  871. {\xdef\svn@pg{\svn@g}}%
  872. {\xdef\svn@pg{\svn@filedir\svn@filebase}}%
  873. \fi
  874. \xdef\svn@filebase{\fink@nextbase}%
  875. \xdef\svn@fileext{\fink@nextext}%
  876. \xdef\svn@filedir{\fink@nextdir}%
  877. \svn@removedotslash\svn@filedir
  878. \svnmulti@begininputfilehook
  879. }%
  880. \def\svnmulti@endinputfilehook{}
  881. \message{Package svn-multi: patching macro '\string\fink@restore' from the
  882. 'fink' package!}%
  883. \let\svnmulti@fink@restore\fink@restore
  884. \def\fink@restore#1{%
  885. \svnmulti@endinputfilehook
  886. \svnmulti@fink@restore{#1}%
  887. \svn@popfilestack
  888. \xdef\svn@filebase{\finkbase}%
  889. \xdef\svn@fileext{\finkext}%
  890. \xdef\svn@filedir{\finkdir}%
  891. \svn@removedotslash\svn@filedir
  892. }%
  893. \def\svnmulti@atbegininputfile{%
  894. \g@addto@macro\svnmulti@begininputfilehook
  895. }
  896. \long\def\svnmulti@atendinputfile#1{%
  897. \begingroup
  898. \@temptokena\expandafter{\svnmulti@endinputfilehook}%
  899. \toks@{#1}%
  900. \xdef\svnmulti@endinputfilehook{\the\toks@\the\@temptokena}%
  901. \endgroup
  902. }
  903. \def\svn@filestack{{}}
  904. \def\svn@pushfilestack{%
  905. \xdef\svn@filestack{{%
  906. {\svnfilerev}%
  907. {\svnfiledate}%
  908. {\svnfileauthor}%
  909. {\svnfileyear}%
  910. {\svnfilemonth}%
  911. {\svnfileday}%
  912. {\svnfilehour}%
  913. {\svnfileminute}%
  914. {\svnfilesecond}%
  915. {\svnfiletimezonehour}%
  916. {\svnfiletimezoneminute}%
  917. {\svnfileurl}%
  918. {\svnfilefname}%
  919. {\svn@g}%
  920. {\svn@pg}%
  921. {\ifsvnfilemodified{@firstoftwo}{@secondoftwo}}%
  922. }\svn@filestack}%
  923. }
  924. \def\svn@restorefilekws#1#2\relax{%
  925. \svn@restorefilekws@#1\empty
  926. \empty \empty \empty \empty
  927. \empty \empty \empty \empty
  928. \empty \empty \empty \empty \empty
  929. \svn@ifempty{#2}%
  930. {\gdef\svn@filestack{{}}}%
  931. {\gdef\svn@filestack{#2}}%
  932. }
  933. \def\svn@restorefilekws@#1#2#3#4#5#6#7#8#9{%
  934. \gdef\svnfilerev{#1}%
  935. \gdef\svnfiledate{#2}%
  936. \gdef\svnfileauthor{#3}%
  937. \gdef\svnfileyear{#4}%
  938. \gdef\svnfilemonth{#5}%
  939. \gdef\svnfileday{#6}%
  940. \gdef\svnfilehour{#7}%
  941. \gdef\svnfileminute{#8}%
  942. \gdef\svnfilesecond{#9}%
  943. \svn@restorefilekws@@
  944. }
  945. \def\svn@restorefilekws@@#1#2#3#4#5#6#7{%
  946. \gdef\svnfiletimezonehour{#1}%
  947. \gdef\svnfiletimezoneminute{#2}%
  948. \gdef\svnfileurl{#3}%
  949. \gdef\svnfilefname{#4}%
  950. \gdef\svn@g{#5}%
  951. \gdef\svn@pg{#6}%
  952. \expandafter\global\expandafter\let
  953. \expandafter\ifsvnfilemodified\csname#7\endcsname%
  954. }
  955. \def\svn@popfilestack{%
  956. \ifx\svn@filestack\empty
  957. \PackageWarning{svn-multi}{Underflow of file keyword stack!}%
  958. \else
  959. \svn@ifequal{\svn@filestack}{{}}%
  960. {\PackageWarning{svn-multi}{Underflow of file keyword stack!}}%
  961. {\expandafter\svn@restorefilekws\svn@filestack\relax}%
  962. \fi
  963. }
  964. \fi
  965. \if@svnmulti@groups
  966. \let\svn@glist=\empty
  967. \def\svngroup#1{%
  968. \svn@ifequal{#1}{*}%
  969. {\PackageError{svn-multi}%
  970. {The group name '*' is invalid for '\string\svngroup'}{}{}%
  971. }{}%
  972. \xdef\svn@g{#1}%
  973. \let\svn@pg\svn@g
  974. \ifx\svn@g\empty\else%
  975. \expandafter
  976. \ifx\csname @svng@\svn@g @rev\endcsname\relax%
  977. \svn@initgroup{\svn@g}%
  978. \ifx\svn@glist\empty
  979. \xdef\svn@glist{#1}%
  980. \else
  981. \xdef\svn@glist{\svn@glist,#1}%
  982. \fi
  983. \fi
  984. \fi
  985. }
  986. \def\thesvngroup{\svn@g}
  987. \def\svnsetcg#1{%
  988. \svn@ifequal{#1}{*}%
  989. {\def\svn@cg{\svn@g}}%
  990. {\def\svn@cg{#1}}%
  991. }
  992. \def\svncg@def#1{%
  993. \expandafter
  994. \def\csname svncg#1\endcsname{%
  995. \@ifundefined{svng@\svn@cg @#1}{??}{%
  996. \csname svng@\svn@cg @#1\endcsname}%
  997. }%
  998. }
  999. \@for\@tempa:=%
  1000. rev,author,date,year,month,day,hour,minute,second,%
  1001. timezonehour,timezoneminute,url,fname%
  1002. \do{%
  1003. \expandafter\svncg@def\expandafter{\@tempa}%
  1004. }
  1005. \def\thesvncg{\svn@cg}
  1006. \def\svng#1#2{%
  1007. \@ifundefined{svng@\svn@temp @#2}%
  1008. {??}%
  1009. {\csname svng@\svn@temp @#2\endcsname}%
  1010. }
  1011. \def\svn@addfiletogroup#1#2{%
  1012. \expandafter
  1013. \ifx\csname @svng@#2@files@#1\endcsname\relax%
  1014. \expandafter\gdef\csname @svng@#2@files@#1\endcsname{1}%
  1015. %
  1016. \@ifundefined{@svng@#2@files}%
  1017. {\expandafter\xdef\csname @svng@#2@files\endcsname{#1}}%
  1018. {\expandafter\xdef\csname @svng@#2@files\endcsname{%
  1019. \csname @svng@#2@files\endcsname,#1%
  1020. }%
  1021. }%
  1022. \fi
  1023. }
  1024. \svnmulti@atbegininputfile{%
  1025. \svn@ifequal{\svn@filepath}{\svn@maindir\jobname.\svn@mainext}%
  1026. {}%
  1027. {\svn@initfile}%
  1028. \svn@ifequal{\svn@fileext}{\svn@mainext}%
  1029. {\svn@addfiletogroup{\svn@filedir\svn@filebase}{\svn@pg}}{}%
  1030. \svn@ifequal{\svn@fileext}{sty}%
  1031. {\svn@addfiletogroup{\svn@filedir\svn@filebase}{\svn@pg}}{}%
  1032. \svn@ifequal{\svn@fileext}{cls}%
  1033. {\svn@addfiletogroup{\svn@filedir\svn@filebase}{\svn@pg}}{}%
  1034. \svn@addfiletogroup{\svn@filepath}{\svn@filedir\svn@filebase}%
  1035. }
  1036. \def\svn@writegroup#1{%
  1037. \def\svn@writekw##1{%
  1038. \immediate\write\svn@write{%
  1039. \noexpand\@namedef{svng@#1@##1}{\csname @svng@#1@##1\endcsname}%
  1040. }%
  1041. }%
  1042. \svn@writekw{rev}%
  1043. \svn@writekw{date}%
  1044. \svn@writekw{author}%
  1045. \svn@writekw{year}%
  1046. \svn@writekw{month}%
  1047. \svn@writekw{day}%
  1048. \svn@writekw{hour}%
  1049. \svn@writekw{minute}%
  1050. \svn@writekw{second}%
  1051. \svn@writekw{timezonehour}%
  1052. \svn@writekw{timezoneminute}%
  1053. \@ifundefined{@svng@#1@files}{}{%
  1054. \immediate\write\svn@write{%
  1055. \noexpand
  1056. \svn@namegdefverb{svng@#1@files}{\csname @svng@#1@files\endcsname}%
  1057. }%
  1058. }%
  1059. \immediate\write\svn@write{%
  1060. \noexpand
  1061. \svn@namegdefverb{svng@#1@url}{\csname @svng@#1@url\endcsname}^^J%
  1062. \noexpand
  1063. \svn@namegdefverb{svng@#1@fname}{\csname @svng@#1@fname\endcsname}^^J%
  1064. }%
  1065. }
  1066. \def\svn@writeallgroups#1{%
  1067. \begingroup
  1068. \ifx\relax#1\relax\else
  1069. \@for\svn@temp:=#1\do{%
  1070. \svn@ifvalidrev{@svng@\svn@temp @rev}%
  1071. {%
  1072. \expandafter
  1073. \svn@cleanfilelist\csname @svng@\svn@temp @files\endcsname
  1074. \svn@writegroup{\svn@temp}%
  1075. \@ifundefined{@svng@\svn@temp @files}{}%
  1076. {\expandafter\svn@writeallgroups
  1077. \csname @svng@\svn@temp @files\endcsname
  1078. }%
  1079. }{}%
  1080. }%
  1081. \fi
  1082. \endgroup
  1083. }
  1084. \def\svn@updategroup#1{%
  1085. \@ifundefined{@svng@#1@rev}%
  1086. {\svn@initgroup{#1}}%
  1087. {}%
  1088. \expandafter
  1089. \ifnum\csname @svng@#1@rev\endcsname<\svnfilerev
  1090. \svn@gkwset{#1}{rev}{\svnfilerev}%
  1091. \svn@gkwset{#1}{date}{\svnfiledate}%
  1092. \svn@gkwset{#1}{author}{\svnfileauthor}%
  1093. \svn@gkwset{#1}{year}{\svnfileyear}%
  1094. \svn@gkwset{#1}{month}{\svnfilemonth}%
  1095. \svn@gkwset{#1}{day}{\svnfileday}%
  1096. \svn@gkwset{#1}{hour}{\svnfilehour}%
  1097. \svn@gkwset{#1}{minute}{\svnfileminute}%
  1098. \svn@gkwset{#1}{second}{\svnfilesecond}%
  1099. \svn@gkwset{#1}{timezonehour}{\svnfiletimezonehour}%
  1100. \svn@gkwset{#1}{timezoneminute}{\svnfiletimezoneminute}%
  1101. \svn@gkwset{#1}{url}{\svnfileurl}%
  1102. \svn@gkwset{#1}{fname}{\svnfilefname}%
  1103. \fi
  1104. }
  1105. \def\svn@definegroup#1{%
  1106. \svn@gkwdef{#1}{rev}%
  1107. \svn@gkwdef{#1}{date}%
  1108. \svn@gkwdef{#1}{author}%
  1109. \svn@gkwdef{#1}{year}%
  1110. \svn@gkwdef{#1}{month}%
  1111. \svn@gkwdef{#1}{day}%
  1112. \svn@gkwdef{#1}{hour}%
  1113. \svn@gkwdef{#1}{minute}%
  1114. \svn@gkwdef{#1}{second}%
  1115. \svn@gkwdef{#1}{timezonehour}%
  1116. \svn@gkwdef{#1}{timezoneminute}%
  1117. \svn@gkwdef{#1}{url}%
  1118. \svn@gkwdef{#1}{fname}%
  1119. }
  1120. \def\svn@initgroup#1{%
  1121. \svn@gkwset{#1}{rev}{\svn@revinit}%
  1122. \svn@gkwset{#1}{date}{}%
  1123. \svn@gkwset{#1}{author}{}%
  1124. \svn@gkwset{#1}{year}{0000}%
  1125. \svn@gkwset{#1}{month}{00}%
  1126. \svn@gkwset{#1}{day}{00}%
  1127. \svn@gkwset{#1}{hour}{00}%
  1128. \svn@gkwset{#1}{minute}{00}%
  1129. \svn@gkwset{#1}{second}{00}%
  1130. \svn@gkwset{#1}{timezonehour}{+00}%
  1131. \svn@gkwset{#1}{timezoneminute}{00}%
  1132. \svn@gkwset{#1}{url}{}%
  1133. \svn@gkwset{#1}{fname}{}%
  1134. }
  1135. \def\svn@gkwset#1#2#3{%
  1136. \expandafter
  1137. \xdef\csname @svng@#1@#2\endcsname{#3}%
  1138. }
  1139. \def\svn@gkwdef#1#2{%
  1140. \expandafter
  1141. \xdef\csname svng@#1@#2\endcsname{\csname @svng@#1@#2\endcsname}%
  1142. }
  1143. \def\svn@cleanfilelist#1{
  1144. \begingroup
  1145. \def\svn@tmplist{}%
  1146. \ifx\relax#1\relax\else
  1147. \@for\svn@temp:=#1\do{%
  1148. \expandafter\svn@ifvalidrev
  1149. \expandafter{@svng@\svn@temp @rev}%
  1150. {\edef\svn@tmplist{\svn@tmplist,\svn@temp}}%
  1151. {}%
  1152. }%
  1153. \xdef#1{\expandafter\@gobble\svn@tmplist\empty}%
  1154. \fi
  1155. \endgroup
  1156. }
  1157. \fi
  1158. \newif\ifsvnsubgroups
  1159. \svnsubgroupsfalse
  1160. \if@svnmulti@subgroups
  1161. \svnsubgroupstrue
  1162. \def\svnsubgroup{%
  1163. \begingroup
  1164. \svn@removedotslash\svn@filedir
  1165. \svn@subgroup{\svn@filedir\svn@filebase}%
  1166. \svn@subgroup{\svn@filepath}%
  1167. \endgroup
  1168. }
  1169. \def\svn@subgroup#1{%
  1170. \ifnum\svnfilerev=\svn@revinit\else
  1171. \expandafter\ifx\csname svn@g@#1\endcsname\relax%
  1172. \expandafter\gdef\csname svn@g@#1\endcsname{1}%
  1173. \svn@updategroup{#1}%
  1174. \fi
  1175. \fi
  1176. }
  1177. \def\svnignoreextensions#1{%
  1178. \@for\svn@temp:=#1\do{%
  1179. \expandafter\def\csname svn@ignore@ext@\svn@temp\endcsname{}%
  1180. }%
  1181. }
  1182. \def\svnconsiderextensions#1{%
  1183. \@for\svn@temp:=#1\do{%
  1184. \expandafter\let\csname svn@ignore@ext@\svn@temp\endcsname\relax%
  1185. }%
  1186. }
  1187. \svnignoreextensions{aux,bbl,fd,enc,fls,glo,idx,ilg,ind,ist,%
  1188. lof,log,lot,out,svn,svt,svx,toc}
  1189. \svnmulti@atendinputfile{%
  1190. \if@svnmulti@subgroups
  1191. \ifsvnsubgroups
  1192. \expandafter\ifx\csname svn@ignore@ext@\svn@fileext\endcsname\relax
  1193. \svnsubgroup
  1194. \fi
  1195. \fi
  1196. \fi
  1197. }
  1198. \if@svnmulti@subgroups
  1199. \ifsvnsubgroups
  1200. \svn@addfiletogroup{\jobname .\svn@mainext}{\jobname}%
  1201. \svnsubgroup
  1202. \fi
  1203. \fi
  1204. \AtBeginDocument{%
  1205. \if@svnmulti@subgroups
  1206. \ifsvnsubgroups
  1207. \@ifundefined{@svng@\svn@g @files@\jobname}%
  1208. {%
  1209. \@namedef{@svng@\svn@g @files@\jobname}{1}%
  1210. \@ifundefined{@svng@\svn@g @files}%
  1211. {%
  1212. \expandafter
  1213. \xdef\csname @svng@\svn@g @files\endcsname{\jobname}%
  1214. }%
  1215. {%
  1216. \expandafter
  1217. \xdef\csname @svng@\svn@g @files\endcsname
  1218. {\jobname,\csname @svng@\svn@g @files\endcsname}%
  1219. }%
  1220. }{}%
  1221. \svnsubgroup
  1222. \fi
  1223. \fi
  1224. }
  1225. \fi
  1226. \if@svnmulti@external
  1227. \if@svnmulti@groups
  1228. \def\svnexternalgroup#1{%
  1229. \svn@ifequal{#1}{*}%
  1230. {\def\svn@externalgroup{\svn@pg}}%
  1231. {\def\svn@externalgroup{#1}}%
  1232. }
  1233. \def\svn@externalgroup{\svn@pg}
  1234. \else
  1235. \def\svn@externalgroup{}
  1236. \fi
  1237. \if@svnmulti@autokw
  1238. \newcommand*\svnexternal[2][]{%
  1239. \svn@pushfilestack
  1240. \svn@ifequal{#1}{*}%
  1241. {\edef\svn@eg{\svn@pg}}%
  1242. {\svn@ifempty{#1}%
  1243. {\edef\svn@eg{\svn@externalgroup}}%
  1244. {\edef\svn@eg{#1}}%
  1245. }%
  1246. \svne@@external#2\relax
  1247. \svn@popfilestack
  1248. }
  1249. \def\svne@@external#1{%
  1250. \ifx\relax#1\empty\else
  1251. \svnegetfile{#1}%
  1252. \begingroup\svn@externalfile{\svn@eg}{#1}%
  1253. \expandafter\svne@@external
  1254. \fi
  1255. }
  1256. \else
  1257. \newcommand*\svnexternal[2][]{%
  1258. \if@filesw
  1259. \svn@checkwrite
  1260. \begingroup
  1261. \svn@ifequal{#1}{*}%
  1262. {\def\svn@temp{\svn@pg}}%
  1263. {\svn@ifempty{#1}%
  1264. {\def\svn@temp{\svn@externalgroup}}%
  1265. {\def\svn@temp{#1}}%
  1266. }%
  1267. \immediate\write\svn@write{%
  1268. \noexpand\@svnexternal[\svn@temp]{\svn@filepath}{#2}%
  1269. }%
  1270. \endgroup
  1271. \fi
  1272. \svn@inputsvx{\svn@filedir\svn@filebase}%
  1273. }
  1274. \fi
  1275. \def\svnexternalpath#1{%
  1276. \if@filesw
  1277. \svn@checkwrite
  1278. \immediate\write\svn@write{%
  1279. \noexpand\@svnexternalpath{#1}%
  1280. }%
  1281. \fi
  1282. }
  1283. \newcommand*\@svnexternal[3][]{}
  1284. \def\@svnexternalpath#1{}
  1285. \newcommand*\svnexternalfile[1][\svn@filedir\svn@filebase]{%
  1286. \begingroup % TODO: maybe use \svn@catcodes
  1287. \catcode`\_=12
  1288. \catcode`\&=12
  1289. \catcode`\^=12
  1290. \catcode`\$=12
  1291. \catcode`\#=12
  1292. \svn@externalfile{#1}%
  1293. }
  1294. \def\svn@externalfile#1#2{%
  1295. \endgroup
  1296. \if@svnmulti@subgroups
  1297. \ifsvnsubgroups
  1298. \svn@ifequal{#1}{\svn@rg}%
  1299. {\svn@addfiletogroup{#2}{\svn@filedir\svn@filebase}}%
  1300. {\svn@addfiletogroup{#2}{#1}}%
  1301. \svn@subgroup{#2}%
  1302. \fi
  1303. \fi
  1304. }
  1305. \else
  1306. \def\svnexternalfile#1{}%
  1307. \fi
  1308. \if@svnmulti@autoload
  1309. \svnmulti@atbegininputfile{%
  1310. \svn@ifequal{\svn@fileext}{tex}%
  1311. {\svn@inputsvx{\svn@filedir\svn@filebase}}%
  1312. {}%
  1313. }
  1314. %%\AtEndOfPackage{%
  1315. \AtBeginDocument{%
  1316. \svn@inputsvx{\jobname}%
  1317. }
  1318. \fi
  1319. \if@svnmulti@anygraphic
  1320. \def\svngraphicsgroup#1{%
  1321. \svn@ifequal{#1}{*}%
  1322. {\def\svn@graphicsgroup{\svn@pg}}%
  1323. {\def\svn@graphicsgroup{#1}}%
  1324. }
  1325. \def\svn@graphicsgroup{\svn@externalgroup}
  1326. \def\svnignoregraphic#1{%
  1327. \expandafter\def\csname svn@ignoregraphic@#1\endcsname{}%
  1328. }
  1329. \def\svnconsidergraphic#1{%
  1330. \expandafter\let\csname svn@ignoregraphic@#1\endcsname\relax%
  1331. }
  1332. \fi
  1333. \if@svnmulti@graphics
  1334. \RequirePackage{graphics}[2006/02/20]
  1335. \message{Package svn-multi: patching macro '\string\Gin@setfile' from the
  1336. 'graphics' package!}%
  1337. \let\svnmulti@Gin@setfile\Gin@setfile
  1338. \renewcommand*{\Gin@setfile}[3]{%
  1339. \expandafter\ifx\csname svn@ignoregraphic@#3\endcsname\relax%
  1340. \svnexternal[\svn@graphicsgroup]{{#3}}%
  1341. \fi
  1342. \svnmulti@Gin@setfile{#1}{#2}{#3}%
  1343. }
  1344. \fi
  1345. \if@svnmulti@pgfimages
  1346. \RequirePackage{pgf}[2008/01/15]
  1347. \message{Package svn-multi: patching macro '\string\pgf@declareimage' and will
  1348. patch generated macros '\string\pgf@image@<name>!' from the 'pgf' package!}%
  1349. \let\svnmulti@pgf@declareimage\pgf@declareimage
  1350. \renewcommand*{\pgf@declareimage}[3][]{%
  1351. \svnmulti@pgf@declareimage[#1]{#2}{#3}%
  1352. \ifx\pgf@filename\empty\else
  1353. \expandafter\ifx\csname svn@ignoregraphic@\pgf@filename\endcsname\relax%
  1354. \expandafter\global\expandafter%
  1355. \let\csname svnmulti@pgf@image@#2!\endcsname=\pgf@image%
  1356. \expandafter\xdef\csname pgf@image@#2!\endcsname{%
  1357. \noexpand\svnexternal[\noexpand\svn@graphicsgroup]{{\pgf@filename}}%
  1358. \csname svnmulti@pgf@image@#2!\endcsname
  1359. }%
  1360. \fi
  1361. \fi
  1362. }
  1363. \fi
  1364. \if@svnmulti@table
  1365. \ifx\tableofcontents\relax\else
  1366. \def\svnrevisionsname{Table of Revisions}%
  1367. \def\svn@svt{svt}
  1368. \AtBeginDocument{%
  1369. \ifx\chapter\relax
  1370. \let\chapter\@undefined
  1371. \fi
  1372. \ifx\chapter\@undefined
  1373. %% Adapted from the \tableofcontents macro, LaTeX `article' class [2005/09/16]
  1374. \newcommand\tableofrevisions{%
  1375. \section*{\svnrevisionsname
  1376. \@mkboth{\MakeUppercase\svnrevisionsname}{\MakeUppercase\svnrevisionsname}}%
  1377. \svn@input{\jobname .\svn@svt}%
  1378. }
  1379. \else
  1380. %% Adapted from the \tableofcontents macro, LaTeX `book' class [2005/09/16]
  1381. \newcommand\tableofrevisions{%
  1382. \expandafter\ifx
  1383. \csname if@twocolumn\expandafter\endcsname
  1384. \csname iftrue\endcsname
  1385. \@restonecoltrue\onecolumn
  1386. \else
  1387. \@restonecolfalse
  1388. \fi
  1389. \chapter*{\svnrevisionsname
  1390. \@mkboth{\MakeUppercase\svnrevisionsname}{\MakeUppercase\svnrevisionsname}}%
  1391. \svn@input{\jobname .\svn@svt}%
  1392. \expandafter\ifx
  1393. \csname if@restonecol\expandafter\endcsname
  1394. \csname iftrue\endcsname
  1395. \twocolumn
  1396. \fi
  1397. }
  1398. \fi
  1399. }
  1400. \fi % defined \tableofcontents
  1401. \def\svn@writerow#1#2#3{%
  1402. \immediate\write\svn@svtwrite{%
  1403. \expandafter\noexpand\csname svn#1row\endcsname
  1404. \expandafter\noexpand\csname svntab#1\endcsname{#2}{#3}\space
  1405. \@ampersamchar\space
  1406. \svn@tabcell{rev}\space\@ampersamchar\space
  1407. \svn@tabcell{author}\space\@ampersamchar\space
  1408. \noexpand\svntabdate%
  1409. \svn@tabcellarg{year}%
  1410. \svn@tabcellarg{month}%
  1411. \svn@tabcellarg{day}%
  1412. \svn@tabcellarg{hour}%
  1413. \svn@tabcellarg{minute}%
  1414. \svn@tabcellarg{second}%
  1415. \svn@tabcellarg{timezonehour}%
  1416. \svn@tabcellarg{timezoneminute}%
  1417. \space\@backslashchar\@backslashchar
  1418. \expandafter\noexpand\csname endsvn#1row\endcsname
  1419. }%
  1420. }
  1421. \def\svn@writegrouprow#1{%
  1422. \begingroup
  1423. \def\svn@tabcellarg##1{{\csname @svng@#1@##1\endcsname}}%
  1424. \def\svn@tabcell##1{\expandafter\noexpand\csname svntab##1\endcsname%
  1425. \svn@tabcellarg{##1}%
  1426. }%
  1427. \svn@writerow{group}{#1}{}%
  1428. \endgroup
  1429. }
  1430. \def\svn@writesubgrouprow#1#2{%
  1431. \begingroup
  1432. \def\svn@tabcellarg##1{{\csname @svng@#2@##1\endcsname}}%
  1433. \def\svn@tabcell##1{\expandafter\noexpand\csname svntab##1\endcsname%
  1434. \svn@tabcellarg{##1}%
  1435. }%
  1436. \svn@writerow{subgroup}{#1}{#2}%
  1437. \endgroup
  1438. }
  1439. \def\svn@writefilerow#1#2{%
  1440. \begingroup
  1441. \def\svn@tabcellarg##1{{\csname @svng@#2@##1\endcsname}}%
  1442. \def\svn@tabcell##1{\expandafter\noexpand\csname svntab##1\endcsname%
  1443. \svn@tabcellarg{##1}%
  1444. }%
  1445. \svn@writerow{file}{#1}{#2}%
  1446. \endgroup
  1447. }
  1448. \def\svn@writeglobalrow{%
  1449. \begingroup
  1450. \def\svn@tabcellarg##1{{\csname @svn@##1\endcsname}}%
  1451. \def\svn@tabcell##1{\expandafter\noexpand\csname svntab##1\endcsname%
  1452. \svn@tabcellarg{##1}%
  1453. }%
  1454. \svn@writerow{global}{}{}%
  1455. \endgroup
  1456. }
  1457. \def\svntable{%
  1458. \begin{tabular}{p{0.425\textwidth}rll}%
  1459. \hline
  1460. }
  1461. \def\endsvntable{\hline\end{tabular}}
  1462. \def\svntablehead{%
  1463. Name & Rev & Last Author & Last Changed At \\\hline
  1464. }
  1465. \def\svntablefoot{}
  1466. \def\svnbeforetable{}
  1467. \def\svnaftertable{\clearpage}
  1468. \def\svnglobalrow{}
  1469. \def\endsvnglobalrow{}
  1470. \def\svngrouprow{}
  1471. \def\endsvngrouprow{}
  1472. \def\svnsubgrouprow{}
  1473. \def\endsvnsubgrouprow{}
  1474. \def\svnfilerow{}
  1475. \def\endsvnfilerow{}
  1476. \def\svntabglobal{Document}
  1477. \def\svntabgroup#1{Group `#1'}
  1478. \def\svntabsubgroup#1{%
  1479. \raggedright
  1480. \addtolength{\leftskip}{#1\medskipamount}%
  1481. \begingroup
  1482. \catcode`\_=12
  1483. \catcode`\&=12
  1484. \catcode`\^=12
  1485. \catcode`\$=12
  1486. \catcode`\#=12
  1487. \svn@tabsubgroup
  1488. }
  1489. \def\svn@tabsubgroup#1{\endgroup Subgroup `\texttt{\small #1}'}
  1490. \def\svntabfile#1{%
  1491. \raggedright
  1492. \addtolength{\leftskip}{#1\medskipamount}%
  1493. \begingroup
  1494. \catcode`\_=12
  1495. \catcode`\&=12
  1496. \catcode`\^=12
  1497. \catcode`\$=12
  1498. \catcode`\#=12
  1499. \svn@tabfile
  1500. }
  1501. \def\svn@tabfile#1{\endgroup File `\texttt{\small #1}'}
  1502. \def\svntabrev{}
  1503. \def\svntabauthor#1{\svnFullAuthor{#1}}
  1504. \def\svntabdate#1#2#3#4#5#6#7#8{%
  1505. #1-#2-#3 #4:#5:#6% #7#8%
  1506. }
  1507. \fi
  1508. \newcommand{\svn}{\@ifnextchar{*}{\svn@s}{\svn@n}}
  1509. \def\svn@n#1{\@svn@n#1}
  1510. \def\svn@s*#1{\@svn@s#1}
  1511. \def\@svn@n$#1${#1}
  1512. \def\@svn@s$#1 ${#1}
  1513. %% Adapted from the \url macro of the `hyperref` package.
  1514. \DeclareRobustCommand*{\svnnolinkurl}{%
  1515. \@ifundefined{hyper@normalise}%
  1516. {\PackageWarning{svn-multi}{Package hyperref is needed for \noexpand
  1517. \svnnolinkurl.}}%
  1518. {\hyper@normalise\svnnolinkurl@}%
  1519. }%
  1520. \def\svnnolinkurl@#1{\Hurl{#1}}%
  1521. \def\svn@getfilename#1{%
  1522. \begingroup
  1523. \gdef\svnfiledir{}%
  1524. \edef\svn@temp{#1}%
  1525. \expandafter\@svn@getfilename\svn@temp/{}\relax
  1526. }%
  1527. \def\@svn@getfilename#1/#2\relax{%
  1528. \svn@ifempty{#2}%
  1529. {%
  1530. \endgroup
  1531. \gdef\svnfilefname{#1}%
  1532. }%
  1533. {%
  1534. \xdef\svnfiledir{\svnfiledir#1/}%
  1535. \@svn@getfilename#2\relax
  1536. }%
  1537. }%
  1538. \@input{\jobname .svn}
  1539. \def\svn@checkwrite{%
  1540. \@ifundefined{svn@write}{%
  1541. \newwrite\svn@write
  1542. \immediate\openout\svn@write=\jobname.svn\relax%
  1543. \immediate\write\svn@write{\@percentchar\space SVN Keyword cache}%
  1544. %\immediate\write\svn@write{\noexpand\makeatletter}%
  1545. }{}%
  1546. \let\svn@checkwrite=\relax
  1547. }
  1548. {\catcode`\&=12
  1549. \gdef\@ampersamchar{&}
  1550. }
  1551. \def\svn@writesvn{%
  1552. \if@svnmulti@groups
  1553. \fi
  1554. \svn@checkwrite
  1555. \immediate\write\svn@write{^^J%
  1556. \@percentchar\space Global values:^^J%
  1557. \noexpand\def\noexpand\svnrev{\@svn@rev}^^J%
  1558. \noexpand\let\noexpand\ifsvnmodified\@backslashchar\@svn@modified^^J%
  1559. \noexpand\def\noexpand\svndate{\@svn@date}^^J%
  1560. \noexpand\def\noexpand\svnauthor{\@svn@author}^^J%
  1561. \noexpand\def\noexpand\svnyear{\@svn@year}^^J%
  1562. \noexpand\def\noexpand\svnmonth{\@svn@month}^^J%
  1563. \noexpand\def\noexpand\svnday{\@svn@day}^^J%
  1564. \noexpand\def\noexpand\svnhour{\@svn@hour}^^J%
  1565. \noexpand\def\noexpand\svnminute{\@svn@minute}^^J%
  1566. \noexpand\def\noexpand\svnsecond{\@svn@second}^^J%
  1567. \noexpand\def\noexpand\svntimezonehour{\@svn@timezonehour}^^J%
  1568. \noexpand\def\noexpand\svntimezoneminute{\@svn@timezoneminute}^^J%
  1569. \noexpand\svn@gdefverb\noexpand\svnurl{\@svn@url}^^J%
  1570. \noexpand\svn@gdefverb\noexpand\svnfname{\@svn@fname}^^J%
  1571. }%
  1572. \if@svnmulti@groups
  1573. \svn@cleanfilelist\@svng@@files
  1574. \immediate\write\svn@write{%
  1575. \noexpand\def\noexpand\svng@@files{\@svng@@files}^^J%
  1576. }%
  1577. \svn@writeallgroups\@svng@@files
  1578. \ifx\svn@glist\empty\else
  1579. \begingroup
  1580. \immediate\write\svn@write{^^J%
  1581. \@percentchar\space SVN File Groups: \svn@glist
  1582. }%
  1583. \svn@writeallgroups\svn@glist
  1584. \endgroup
  1585. \fi
  1586. \else
  1587. \immediate\write\svn@write{^^J}%
  1588. \fi
  1589. \immediate\closeout\svn@write%
  1590. }
  1591. \def\svn@writegroupfiles#1{%
  1592. \begingroup
  1593. \advance\svn@grouplevel by 1\relax
  1594. \expandafter\let
  1595. \expandafter\svn@files\csname @svng@#1@files\endcsname
  1596. \ifx\svn@files\relax\else
  1597. \svn@cleanfilelist\svn@files
  1598. \@for\svn@file:=\svn@files\do{%
  1599. \svn@ifvalidrev{@svng@\svn@file @rev}%
  1600. {%
  1601. \@ifundefined{@svng@\svn@file @files}%
  1602. {\svn@writefilerow{\the\svn@grouplevel}{\svn@file}}%
  1603. {\svn@ifonlyone{\svn@file}%
  1604. {\svn@writefilerow{\the\svn@grouplevel}%
  1605. {\csname @svng@\svn@file @files\endcsname}}%
  1606. {\svn@ifempty{\csname @svng@\svn@file @files\endcsname}%
  1607. {}%
  1608. {%
  1609. \svn@writesubgrouprow{\the\svn@grouplevel}{\svn@file}%
  1610. \svn@writegroupfiles{\svn@file}%
  1611. }%
  1612. }%
  1613. }%
  1614. }{}%
  1615. }%
  1616. \fi
  1617. \endgroup
  1618. }%
  1619. \def\svn@writesvt{%
  1620. \if@svnmulti@table
  1621. \newwrite\svn@svtwrite
  1622. \immediate\openout\svn@svtwrite=\jobname.\svn@svt\relax
  1623. \@onelevel@sanitize\svntable%
  1624. \immediate\write\svn@svtwrite{%
  1625. \noexpand\svnbeforetable^^J%
  1626. \svntable
  1627. \noexpand\svntablehead^^J%
  1628. }%
  1629. \let\svn@grouplevel\@tempcnta
  1630. \svn@grouplevel=0\relax
  1631. \svn@writeglobalrow{}%
  1632. \svn@writegroupfiles{}%
  1633. \@for\svn@g:=\svn@glist\do{%
  1634. \@ifundefined{@svng@\svn@g @rev}{}%
  1635. {%
  1636. \expandafter
  1637. \ifnum\csname @svng@\svn@g @rev\endcsname>0\relax
  1638. \svn@writegrouprow{\svn@g}%
  1639. \svn@writegroupfiles{\svn@g}%
  1640. \fi
  1641. }%
  1642. }%
  1643. \@onelevel@sanitize\endsvntable%
  1644. \immediate\write\svn@svtwrite{%
  1645. \noexpand\svntablefoot^^J%
  1646. \endsvntable^^J%
  1647. \noexpand\svnaftertable
  1648. }%
  1649. \immediate\closeout\svn@svtwrite%
  1650. \fi
  1651. }
  1652. \if@svnmulti@autokwall
  1653. \svnmulti@atbegininputfile{%
  1654. \expandafter
  1655. \ifx\csname svn@ignore@ext@\svn@fileext\endcsname\relax
  1656. \svnegetfile{\svn@filepath}%
  1657. \fi
  1658. }
  1659. \fi
  1660. \AtEndDocument{%
  1661. \if@filesw
  1662. \ifx\@svn@rev\empty\else
  1663. \ifnum\@svn@rev<1\else
  1664. \svn@writesvn
  1665. \svn@writesvt
  1666. \fi
  1667. \fi
  1668. \fi
  1669. }
  1670. \endinput
  1671. %%
  1672. %% End of file `svn-multi.sty'.