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 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376
|
\documentclass{article}
\usepackage[a4paper,twoside=true,hmargin=5cm,vmargin=4.3cm]{geometry} % Mise en page
\usepackage[T1]{fontenc} % Encodage pour fichier généré
\usepackage[utf8]{inputenc} % Encodage pour fichier source
\usepackage[english,german, spanish, italian,french]{babel} % Typographie française
\usepackage{xspace} % Gestion des espaces
\usepackage[svgnames]{xcolor} % Couleur
\usepackage{marginnote} % Notes marginales
\usepackage{hyperref} % Références croisées en hypertexte
\hypersetup{colorlinks=true, allcolors=Black} % Paramétrage des hyperliens
\usepackage[french]{varioref} % Gestion des références de page
\usepackage{graphicx} % Ingération d'images
\usepackage{xparse} % Création de commandes
\usepackage{soul} % texte souligné
\usepackage{lipsum} % Faux texte
\usepackage{conditext} % Gestion de texte conditionnel
\setlength{\parskip}{5pt} % Espace inter-paragraphes
\setminicondispace{french}
%//// Commandes internes ///////////////////////////////////////////
\NewDocumentCommand\initcap{m m}{% % Interface servant à mettre en majuscule la première lettre d'un mot/groupe de mot sur valeur booléenne "true"
\IfBooleanTF{#1}{\capitalize{#2}}{#2}}
\NewDocumentEnvironment{listplus}{m}% % Liste personnalisée
{\begin{list}{}{\setlength{\topsep}{2mm}%
\setlength{\partopsep}{0mm}\setlength{\itemsep}{0mm}%
\setlength{\leftmargin}{2mm}#1}}{\end{list}}
%//// Mise en évidence de mots /////////////////////////////////////////////////
%//// Citation
\NewDocumentCommand\titcit{m}{\emph{#1}} % Titre de document cité
%//// Noms propres
\NewDocumentCommand\techname{m}{\textsf{#1}} % Nom propre d'élément technique
\NewDocumentCommand\app{m}{\techname{#1}} % Nom d'application
\NewDocumentCommand\class{m}{\techname{#1}} % Nom de classe
\NewDocumentCommand\xclass{s m}{% % Nom de classe avec terme introducteur
\IfBooleanTF{#1}{\classml*}{\classml} \class{#2}}
\NewDocumentCommand\dist{m}{\techname{#1}} % Nom de distribution
\NewDocumentCommand\dial{m}{\techname{#1}} % Nom de fenêtre de dialogue
\NewDocumentCommand\file{m O{}}{\techname{#1}% % Nom de fichier
\ifthenelse{\NOT\equal{#2}{}}{.#2}{}}
\NewDocumentCommand\menu{m}{\techname{#1}} % Nom de menu
\NewDocumentCommand\pack{m}{\techname{#1}} % Nom de paquet
\NewDocumentCommand\xpack{s m}{% % Nom de paquet avec terme introducteur
\IfBooleanTF{#1}{\packml*}{\packml} \pack{#2}}
\newcommand\Latex{\LaTeX\xspace} % "LaTeX"
\NewDocumentCommand\site{s m o}{% % Nom de site
\IfBooleanTF{#1}{%
\ifthenelse{\NOT\equal{#2}{}}{\techname{#2}}{\techname{?}}}
{\techname{\url{www.#2.#3}}}}
\NewDocumentCommand\sys{s m}{% % Nom de système
\techname{#2}\IfBooleanT{#1}{\tmark}}
\NewDocumentCommand\tmark{}{\techname{\scriptsize{\texttrademark}}} % Symbole "trademark"
%//// Termes techniques
\NewDocumentCommand\termml{m m O{} O{} O{} O{} O{} O{} O{}}{% % Matrice servant à définir des termes en version multilingue
\miniconditext{\initcap{#1}{#2}}[\initcap{#1}{#3}][\initcap{#1}{#4}]%
[\initcap{#1}{#5}][\initcap{#1}{#6}][\initcap{#1}{#7}][\initcap{#1}{#8}]%
[\initcap{#1}{#9}]}
\NewDocumentCommand\argnml{s}{% % "Argument" en différentes langues
\termml{#1}{argument}[argument]}
\NewDocumentCommand\classml{s}{% % "Classe" en différentes langues
\termml{#1}{classe}[class]}
\NewDocumentCommand\cmdnml{s}{% % "Commande" en différentes langues
\termml{#1}{commande}[command]}
\NewDocumentCommand\envnml{s}{% % "Environnement" en différentes langues
\termml{#1}{environnement}[environment]}
\NewDocumentCommand\valoptml{s}{% % "Option" en différentes langues
\termml{#1}{option}[option]}
\NewDocumentCommand\packml{s}{% % "Paquet" en différentes langues
\termml{#1}{paquet}[package]}
\NewDocumentCommand\valml{s}{% % "Valeur" en différentes langues
\termml{#1}{valeur}[value]}
\NewDocumentCommand\techterm{m}{\emph{#1}} % Terme technique
\NewDocumentCommand\conc{m}{\techterm{#1}} % Notion
%//// Éléments de code
\NewDocumentCommand\code{m}{\textnormal{\texttt{#1}}} % Élément de code
\NewDocumentCommand\coden{m}{\txtvar{#1}} % Élément de code : intitulé
\NewDocumentEnvironment{codeblock}{}% % Bloc de code
{\begin{list}{}{\setlength{\topsep}{2mm}%
\setlength{\partopsep}{0mm}\setlength{\itemsep}{0mm}%
\setlength{\leftmargin}{2mm}\ttfamily}}{\end{list}}
\NewDocumentEnvironment{subcodeblock}{}% % Sous-bloc de code
{\begin{list}{}{\setlength{\topsep}{0mm}%
\setlength{\partopsep}{0mm}\setlength{\itemsep}{0mm}%
\setlength{\leftmargin}{2mm}\ttfamily}}{\end{list}}
\NewDocumentCommand\codestm{s m}{% % Instruction de code
\IfBooleanTF{#1}%
{\begin{codeblock}\item {#2}\end{codeblock}}%
{\item \small#2}}
\NewDocumentCommand\endstm{}{\code{\%}} % Marque de fin dans une instruction
\NewDocumentCommand\cmdn{m}{\code{\textbackslash#1}} % Commande : nom pour mention
\NewDocumentCommand\xcmdn{s m}{% % Commande : nom pour mention avec terme introducteur
\IfBooleanTF{#1}{\cmdnml*}{\cmdnml} \cmdn{#2}}
\NewDocumentCommand\cmdnx{m}{\code{#1}} % Commande : extrait de nom
\NewDocumentCommand\cmd{s m O{} O{}}{% % Commande : forme déclarative
\IfBooleanTF{#1}%
{\code{\textbackslash#2*}}%
{\code{\textbackslash#2}}#3%
\ifthenelse{\NOT\equal{#4}{}}
{\textnormal{#4}}{}}
\NewDocumentCommand\cmdheader{m m}{% % Commande : signature
\codestm*{\cmd{#1}[#2]}}
\NewDocumentCommand\envn{s m}{% % Environnement : nom pour mention
\IfBooleanTF{#1}
{\cmd{begin}[\argm{#2}]\\\cmd{end}[\argm{#2}]}
{\code{#2}}}
\NewDocumentCommand\xenvn{s m}{% % Environnement : nom pour mention avec terme introducteur
\IfBooleanTF{#1}{\envnml*}{\envnml} \envn{#2}}
\NewDocumentCommand\env{m O{} O{}}{% % Environnement : forme déclarative
\begin{codeblock}
\codestm{\cmd{begin}[\argm{#1}#2]}%
\IfNoValueF{#3}%
{\codestm{\code{#3}}}%
\codestm{\cmd{end}[\argm{#1}]}%
\end{codeblock}}
\NewDocumentCommand\envheader{m m}{% % Environnement : signature
\codestm*{\env{#1}[#2][\txt]}}
\NewDocumentCommand\argmbegin{}{\{} % Borne de début d'argument obligatoire
\NewDocumentCommand\argmend{}{\}} % Borne de fin d'argument obligatoire
\NewDocumentCommand\argm{m}{\code{\argmbegin{#1}\argmend}} % Argument obligatoire
\NewDocumentCommand\argmvoid{m}{\code{\argmbegin{\,}\argmend}} % Argument obligatoire vide
\NewDocumentCommand\argo{m}{\code{[{#1}]}} % Argument facultatif
\NewDocumentCommand\argovoid{m}{\code{[{\,}]}} % Argument facultatif vide
\NewDocumentCommand\argn{m}{\coden{#1}} % Argument : intitulé
\NewDocumentCommand\xargn{s m}{% % Argument : intitulé avec terme introducteur
\IfBooleanTF{#1}{\argnml*}{\argnml} \argn{#2}}
\NewDocumentCommand\val{m}{\code{#1}} % Valeur d'argument
\NewDocumentCommand\xval{s m}{% % Valeur d'argument avec terme introducteur
\IfBooleanTF{#1}{\valml*}{\valml} \val{#2}}
\NewDocumentCommand\valopt{m}{\code{#1}} % Valeur d'option
\NewDocumentCommand\xvalopt{s m}{% % Valeur d'option avec terme introducteur
\IfBooleanTF{#1}{\valoptml*}{\valoptml} \val{#2}}
\NewDocumentEnvironment{valenum}{m}{% % Liste de valeurs
\begin{listplus}{\rmfamily}
\item #1
\end{listplus}}{}
\NewDocumentCommand\comm{m}{\code{\endstm{}\quad#1}} % Commentaire de code
\NewDocumentCommand\txtvar{m}{$\langle$\textrm{\emph{#1}}$\rangle$} % Texte variable dans une expression de code
\NewDocumentCommand\txt{}{\coden{text}} % Texte : représentation dans une expression de code
%//// Texte spécialisé
\NewDocumentEnvironment{exmptextnormal}{+b}{\textnormal #1}{}
\NewDocumentCommand\quo{m}{\og#1\fg} % Texte entre guillemets
\NewDocumentEnvironment{ltext}{}% % Texte littéral
{\begin{list}{}{\setlength{\topsep}{2mm}%
\setlength{\partopsep}{0mm}\setlength{\itemsep}{0mm}%
\setlength{\leftmargin}{5mm}\sffamily\small}}{\end{list}}
\NewDocumentCommand\ltextline{m}{\item#1} % Texte littéral : ligne
%//// Références
\NewDocumentCommand\seeml{s}{% % "cf." en différentes langues
\termml{#1}{cf.}[see]}
\NewDocumentCommand\seeref{s m}{% % Référence précédée de "cf."
\IfBooleanTF{#1}
{\vpageref{#2}}
{\seeml{}~\vpageref{#2}}}
\NewDocumentCommand\titref{m}{% % Référence avec titre
\emph{\nameref{#1}}}
%//// Organisation du texte
\NewDocumentCommand\resumepar{}{\noindent} % Reprise de paragraphe après incise
\NewDocumentCommand\tutostep{O{}}{% % Étape de tutoriel
\subparagraph*{#1}}
\NewDocumentCommand\cmdbookmark{m}{% % Signet de commande
\marginnote{\small{\cmdn{#1}}}}
\NewDocumentCommand\envbookmark{m}{% % Signet d'environnement
\marginnote{\small{\envn*{#1}}}}
\NewDocumentCommand\note{m}{\paragraph*{#1.}} % Note
\begin{document}
\title{\xpack{conditext}}
\author{Jean-Louis Brabant}
\date{Version 1.5 du 1 juin 2020}
\maketitle
\begin{abstract}
Ce paquet permet de définir et gérer du contenu conditionnel (multilingue ou autre) dans un document source \LaTeX, sous la forme de commandes d'emploi aisé, et selon un paramétrage minimal.
\end{abstract}
\setcounter{tocdepth}{2}
\tableofcontents
\part*{Introduction}
Ce paquet fournit quelques facilités, sous la forme d'une petite dizaine de commandes, pour définir et gérer du contenu conditionnel dans un document source \Latex.
Un \conc{contenu conditionnel}, au sens où ce paquet l'entend et le gère, est un texte (y compris sous forme de formules mathématiques ou autres) et/ou un élément graphique (diagramme, figure, image...) se présentant sous des formes pouvant se substituer les unes aux autres -- appelées \conc{formes substituables} dans cette documentation -- qui, en fonction d'un test de condition, figurent ou non dans le document généré.
L'une des gestions de contenu conditionnel les plus courantes est d'ordre multilingue, mais il peut aussi s'agir d'éditions \quo{versionnées}, de niveaux de services, de niveaux de confidentialité etc.
\note{Comment exploiter cette documentation}
Pour une toute première utilisation du \xpack{conditext}, il est fortement conseillé, après un survol de cette documentation, de se reporter directement à la partie \titref{CtDoc_Tuto}. L'on y apprend à utiliser les différentes commandes disponibles, dans des contextes variés, avec des conseils de bonne pratique qui en permettront par la suite une exploitation optimisée.
Une fois en mesure d'utiliser les principales ressources fonctionnelles du présent paquet, l'on pourra, avec profit et à loisir, consulter la partie \titref{CtDoc_Commandes} pour toutes précisions utiles concernant les différentes commandes.
\part{Guide de l'utilisateur/référence des commandes}\label{CtDoc_Commandes}
\section{Généralités}
\subsection{Principe général}
La philosophie du \xpack{conditext} repose sur les notions respectives de domaine de condition (\quo{condition field} en anglais), de propriété de condition (\quo{condition property}) et d'espace de condition (\quo{condition space}).
Avec \pack{conditext}, dans un document source, toute forme substituable est identifiée par un domaine de condition et une propriété de condition.
Le \conc{domaine de condition} est une thématique fonctionnelle qui permet de regrouper des formes substituables pour une même gestion conditionnelle.
La \conc{propriété de condition} est une caractérisation fonctionnelle propre à chaque forme substituable d'une même domaine de condition.
L'\conc{espace de condition} permet de désigner la ou les formes substituables qui doivent figurer dans le document généré. L'on définit un espace de condition en spécifiant un domaine de condition et une propriété de condition propres à correspondre à une ou plusieurs formes substituables.
\subsection{Déclaration du paquet/option}
L'on déclare le \xpack{conditext} par l'instruction \cmdn{usepackage} (ou \cmdn{requirespackage} s'il s'agit d'intégrer \pack{conditext} dans un paquet personnalisé).
Pour information, \pack{conditext} fait usage des paquets \pack{xifthen} et \pack{xparse}.
\note{Option}
Dans sa déclaration, \pack{conditext} accepte une option, sous la forme :
\codestm*{\cmd{usepackage}[\argo{defaultdisplayall}\argm{conditext}]}
Par défaut (déclaration du paquet sans option), tant qu'aucun espace de condition n'est défini, aucune forme substituable quelle qu'elle soit, ne figure dans le document généré. L'option \val{defaultdisplayall} permet de modifier ce comportement : lorsqu'elle est spécifiée, si aucun espace de condition n'est défini, toute forme substituable figure dans le document généré. Pour retrouver le comportement d'origine, il suffit de retirer l'option dans la déclaration du paquet.
\subsection{Modalités d'utilisation des commandes}
Le \xpack{conditext} fournit une petite dizaine de commandes, décrites en détail dans les pages qui suivent, et qui se répartissent en deux grandes catégories selon leur nature et leurs fonctionnalités :
L'\xenvn{conditext} (\seeref{CtDoc_Commandes_CondiText}), ainsi que les commandes \cmdn{setcondispace} (\seeref{CtDoc_Commandes_SetCondiSpace}), \cmdn{newcondifield} (\seeref{CtDoc_Commandes_NewCondiField}), \cmdn{newcondiprop} (\seeref{CtDoc_Commandes_NewCondiProp}) et \cmdn{setimplicitcondifield} (\seeref{CtDoc_Commandes_SetImplicitCondiField}) sont destinés à une gestion conditionnelle à l'échelle multi-paragraphique (de plusieurs dizaines à plusieurs milliers de signes), appelée désormais en tant que telle \conc{gestion de contenu conditionnel}.
Les commandes \cmdn{miniconditext} (\seeref{CtDoc_Commandes_MiniCondiText}), \cmdn{setminicondispace} (\seeref{CtDoc_Commandes_MiniCondiText}) et \cmdn{setminicondiprop-} (\seeref{CtDoc_Commandes_SetMiniCondiProp-}) sont destinées à une gestion conditionnelle à l'échelle paragraphique ou intra-paragraphique (mots, groupes de mots), appelée désormais \conc{mini-gestion conditionnelle}.
\note{Complémentarité des commandes}
Dans un document-source, une mini-gestion conditionnelle peut être mise en oeuvre de manière indépendante, ou conjointement à une gestion conditionnelle ; d'une certaine manière, l'une et l'autre sont \emph{complémentaires}.
Dans le cas d'une gestion conditionnelle multilingue, l'\xenvn{conditext} et la \xcmdn{setcondispace} sont directement exploitables, sans nécessiter de préalable d'aucune sorte. Pour toute autre gestion de contenu conditionnel, avant d'utiliser ces commandes, il est nécessaire de procéder aux créations des domaines de condition et propriétés de condition nécessaires, au moyen des commandes \cmdn{newcondifield} et \cmdn{newcondiprop}.
\note{Emplacement des instructions}
De manière générale, les intructions \cmdn{setcondispace}, \cmdn{newcondifield}, \cmdn{newcondiprop}, \cmdn{setimplicitcondifield}, \cmdn{setminicondispace} et \cmdn{setminicondiprop-} devront être placées dans le préambule.
Toute instruction \envn{conditext} sera placée dans le corps même du document source.
Une instruction \cmdn{miniconditext} pourra, selon les cas, être placée soit dans le préambule, soit dans le corps du document source.
\section{Commandes relatives à la gestion de contenu conditionnel}
\subsection{Saisie des formes substituables}\label{CtDoc_Commandes_CondiText}
Tout contenu que l'on souhaite gérer comme forme substituable doit être saisi dans un \xenvn{conditext}\envbookmark{conditext}. Cet environnement -- éponyme du présent paquet -- s'utilise sous la forme suivante :
\envheader{conditext}{\argo{\argn{domaine de condition}}\argm{\argn{propriété de condition}}\argo{*}}
\subsubsection{Arguments et syntaxe}
Les arguments \argn{domaine de condition} et \argn{propriété de condition} sont à renseigner l'un et l'autre avec une valeur de type alphabétique, sans caractères accentués ou à diacritiques, et sans espaces.
Concernant l'argument~\val{*}, \seeref{CtDoc_Commandes_CondiText_Etoile}.
Il est indispensable que \argn{domaine de condition} et \argn{propriété de condition} aient été au préalable déclarés -- nous dirons désormais \emph{créés} -- (commandes \cmdn{newcondifield} et \cmdn{newcondiprop}, cf. respectivement \seeref*{CtDoc_Commandes_NewCondiField} et \seeref*{CtDoc_Commandes_NewCondiProp}) ; dans le cas contraire, un message d'erreur sera déclenché lors de la compilation.
En outre, la propriété de condition spécifiée doit avoir été impérativement créée avec un domaine de rattachement (\seeref{CtDoc_Commandes_NewCondiProp}) identique à celui précisé en \xargn{domaine de condition} ; si tel n'est pas le cas, un message d'erreur sera sera déclenché lors de la compilation.
Si les arguments \argn{domaine de condition} ou \argn{propriété de condition} sont conjointement laissés vides (\argovoid{} et \argmvoid{}), un message d'erreur sera déclenché lors de la compilation.
Par défaut, dans un contexte de gestion de contenu conditionnel \emph{multilingue}, l'\xargn{propriété de condition} n'a pas besoin d'être renseigné (\seeref{CtDoc_Commandes_CondiText_Multilingue}).
\subsubsection{Utilisation}\label{CtDoc_Commandes_CondiText_Utilisation}
Un \xenvn{conditext} est, à l'instar de l'\xenvn{document}, d'amplitude large et peut contenir de plusieurs dizaines à plusieurs milliers de signes. Tous les aspects propres à l'organisation et à la composition d'un texte sous \Latex (divisions, paragraphes, listes etc.) y sont laissés à l'appréciation de l'utilisateur.
Dans un document source, il y aura autant d'environnments \envn{conditext} que souhaité. Les propriétés de condition et/ou les domaines de condition spécifiés pourront ou non être identiques, selon les besoins (plusieurs formes substituables appartenant à une même thématique, contenu conditionnel fragmenté et réparti à différents endroits du document source etc.).
\note{Environnements imbriqués}
Les environnements \envn{conditext} peuvent être imbriqués, à volonté, et autoriser ainsi diverses \quo{profondeurs} de condition, sur la base de domaines de condition différenciés (à savoir qu'imbriquer des environnements \envn{conditext} de domaines de condition identiques sera inévitablement source d'effets inattendus ou indésirables).
La sémantique d'imbrication et son niveau de \emph{profondeur} sont laissés à l'appréciation de l'utilisateur.
Dans le cas de contenus conditionnels imbriqués, les espaces de condition présentent certaines particularités de comportement (\seeref{CtDoc_Commandes_SetCondiSpace_Utilisation}).
\subsubsection{Argument étoile}\label{CtDoc_Commandes_CondiText_Etoile}
L'\xenvn{conditext} accepte une étoile en troisième argument sous la forme :
\codestm*{\env{conditext}[\argo{\argn{domaine de condition}}\argm{\argn{propriété de condition}}*][\txt]}
Atypique de par sa position en regard de l'usage habituel de l'étoile dans les commandes et environnements \Latex, l'argument~\val{*} affecte ponctuellement la prise en compte du domaine de condition et de la propriété de condition dans un espace de condition et modifie ainsi la logique d'affichage de la forme substituable correspondante dans le document généré.
Plus précisément, l'étoile permet : soit de forcer l'inclusion de la forme substituable dans le document généré lorsqu'elle n'est pas désignée par un espace de condition ; soit à l'inverse, de forcer l'exclusion de la forme sustituable dans le document généré lorsqu'elle est désignée par un espace de condition.
Cet argument est prévu pour une gestion individualisée \quo{au plus près} des formes substituables et son usage doit être en principe limité à des situations appropriées.
Il est possible -- même si cette pratique est déconseillée car peu régulière (et encore moins efficace dans le cas d'un document source comportant de nombreuses instructions \envn{conditext}) --, de ne pas définir d'espace de condition et d'utiliser uniquement l'argument~\val{*} pour forcer directement l'affichage ou le non affichage des formes substituables dans le document généré (le résultat étant inversé selon que le \xpack{conditext} est déclaré sans ou avec l'\xvalopt{defaultdisplayall}).
\subsubsection{Contenu conditionnel multilingue}\label{CtDoc_Commandes_CondiText_Multilingue}
Par défaut, lorsqu'un \xenvn{conditext} est destiné à gérer un contenu conditionnel multilingue, l'\xargn{domaine de condition} n'a pas à être spécifié. Il s'agit en fait d'un domaine de condition prédéfini, intitulé \val{language}, pris en compte implicitement. L'on peut ainsi formuler une instruction \envn{conditext} à sémantique linguistique sous la forme :
\codestm*{\env{conditext}[\argm{\argn{propriété de condition}}\argo{*}][\txt]}
Ce comportement par défaut est cependant modifié dès lors qu'un domaine de condition implicite est défini par l'utilisateur (\xcmdn{setimplicitcondifield}, \seeref{CtDoc_Commandes_SetImplicitCondiField}). il est alors nécessaire de spécifier \emph{explicitement} \val{language} comme domaine de condition dans toute instruction \envn{conditext} devant gérer un contenu conditionnel multilingue. Ceci s'applique également à la \xcmdn{setcondispace}, \seeref{CtDoc_Commandes_SetCondiSpace}.
\note{Prise en charge par \pack{babel}}
L'\xargn{propriété de condition} doit être impérativement renseigné avec l'une des appellations linguistiques en vigueur dans le \xpack{babel}. Le \xpack{conditext} dispose des propriétés de condition prédéfinies suivantes :
\begin{valenum}
{\val{albanian}, \val{american}, \val{arabic}, \val{armenian}, \val{bosnian}, \val{brazilian}, \val{breton}, \val{canadian}, \val{cantonese}, \val{catalan}, \val{chinese}, \val{croatian}, \val{czech}, \val{danish}, \val{dutch}, \val{english}, \val{esperanto}, \val{estonian}, \val{finnish}, \val{french}, \val{georgian}, \val{german}, \val{greek}, \val{hebrew}, \val{hungarian}, \val{icelandic}, \val{irish}, \val{italian}, \val{japanese}, \val{lithuanian}, \val{luxemburgish}, \val{macedonian}, \val{mexican}, \val{norsk}, \val{occitan}, \val{portuguese}, \val{romanian}, \val{romansh}, \val{russian}, \val{sanskrit}, \val{serbian}, \val{slovenian}, \val{spanish}, \val{swedish}, \val{tibetan}, \val{turkish}, \val{ukrainian}, \val{vietnamese}.}
\end{valenum}
Les propriétés de condition de sémantique linguistique sont plus que de simples \quo{étiquettes} ; elles permettent en fait de prendre en charge, pour chaque forme substituable saisie, le support linguistique spécifique -- notamment la gestion des césures-- disponible dans \xpack{babel}.
Il est de ce fait indispensable que \pack{babel} soit déclaré dans le préambule, accompagné des langues susceptibles d'être spécifiées en propriétés de condition (se reporter à la documentation \pack{babel} pour plus de détails sur la déclaration du paquet et des langues). Les commandes du \xpack{conditext} ne prennent pas en compte la précédence de langue propre à \pack{babel} avec \val{main}.
Dans sa version actuelle, le \xpack{conditext} ne permet pas de créer de nouvelles propriétés de condition à sémantique linguistique.
\subsubsection{Domaines de condition et propriétés de condition prédéfinis}
Outres le domaine de condition \val{language} et les propriétés de condition à sémantique linguistique, le \xpack{conditext} fournit plusieurs domaines de condition et propriétés de condition prédéfinis, à appellation générique, avant tout destinés à des gestions de contenu conditionnel peu exigeantes ou à des tests.
Le principal (unique ?) avantage de ces domaines de condition et propriétés de condition prédéfinis est d'éviter à l'utilisateur des créations qui pourraient s'avérer fastidieuses, dans le cas de tests notamment.
Les domaines de condition génériques prédéfinis sont au nombre de~3, disposant chacun d'un jeu de 9 propriétés de condition, soit :
\begin{itemize}
\item le domaine de condition \val{fieldi}, avec les propriétés de condition
\begin{valenum}
{ \val{propa}, \val{propb}, \val{propc}, \val{propd}, \val{prope}, \val{propf}, \val{propg}, \val{proph}, \val{propi} ;}
\end{valenum}
\item le domaine de condition \val{fieldii}, avec les propriétés de condition
\begin{valenum}
{ \val{propaa}, \val{propbb}, \val{propcc}, \val{propdd}, \val{propee}, \val{propff}, \val{propgg}, \val{prophh}, \val{propii} ;}
\end{valenum}
\item le domaine de condition \val{fieldiii}, avec les propriétés de condition
\begin{valenum}
{ \val{propaaa}, \val{propbbb}, \val{propccc}, \val{propddd}, \val{propeee}, \val{propfff}, \val{propggg}, \val{prophhh}, \val{propiii}.}
\end{valenum}
\end{itemize}
\subsection{Définition d'un espace de condition}\label{CtDoc_Commandes_SetCondiSpace}
L'on définit un espace de condition au moyen de la \xcmdn{setcondispace}\cmdbookmark{setcondispace}, sur la base conjointe d'un domaine de condition et d'une propriété de condition, sous la forme suivante :
\cmdheader{setcondispace}{\argo{*}\argo{\argn{domaine de condition}}\argm{\argn{propriété de condition}}}
\subsubsection{Arguments et syntaxe}
Les arguments \argn{domaine de condition} et \argn{propriété de condition} sont à renseigner l'un et l'autre avec une valeur de type alphabétique, sans caractères accentués ou à diacritiques, et sans espaces.
Concernant l'argument~\val{*}, \seeref{CtDoc_Commandes_SetCondiSpace_Etoile}.
Il est indispensable que \argn{domaine de condition} et \argn{propriété de condition} aient été créés au préalable (commandes \cmdn{newcondifield} et \cmdn{newcondiprop}, cf. respectivement \seeref*{CtDoc_Commandes_NewCondiField} et \seeref*{CtDoc_Commandes_NewCondiProp}) ; dans le cas contraire, un message d'erreur sera déclenché lors de la compilation.
En outre, la propriété de condition spécifiée doit avoir été impérativement créée avec un domaine de rattachement (\seeref{CtDoc_Commandes_NewCondiProp}) identique à celui précisé en \xargn{domaine de condition} ; si tel n'est pas le cas, un message d'erreur sera sera déclenché lors de la compilation.
Si les arguments \argn{domaine de condition} ou \argn{propriété de condition} sont conjointement laissés vides (\argovoid{} et \argmvoid{}), un message d'erreur sera déclenché lors de la compilation.
Dans un contexte de gestion de contenu conditionnel \emph{multilingue}, l'\xargn{domaine de condition} n'a pas besoin d'être renseigné (\seeref{CtDoc_Commandes_SetCondiSpace_Multilingue}).
Pour un usage spécifique de l'\xargn{propriété de condition} vide, \seeref{CtDoc_Commandes_SetCondiSpace_EspaceConditionGlobal}).
\subsubsection{Utilisation}\label{CtDoc_Commandes_SetCondiSpace_Utilisation}
Un espace de condition permet de désigner quelles formes substituables doivent figurer dans le document généré, en fonction d'un domaine de condition et d'une propriété de condition propres à correspondre aux formes substituables concernées.
Plus précisément, un espace de condition repose sur un test de correspondance de type \quo{égal à} strict, entre : d'une part, un domaine de condition \emph{et} une propriété de condition spécifiés en arguments d'une instruction \envn{setcondispace}, et d'autre part, un domaine de condition \emph{et} une propriété de condition spécifiés en arguments d'une instruction \envn{conditext}.
Si aucune correspondance n'existe, l'instruction \cmdn{setcondispace} est sans effet (tout se passe comme s'il n'y avait pas d'instruction formulée) ; sinon, toute forme substituable satisfaisant au test de correspondance figure dans le document généré.
L'actuelle version du \xpack{conditext} supporte uniquement les tests de correspondance de type \quo{égal à} strict.
\note{Instructions multiples}
Il y aura autant d'instructions \cmdn{setcondispace} que souhaité, avec domaines de condition identiques ou non, en fonction des besoins (notamment dès lors la \quo{profondeur} de la gestion conditionnelle mise en oeuvre sera concernée). Si un espace de condition est défini deux fois, un message d'erreur sera déclenché lors de la compilation.
Lorsque plusieurs instructions \cmd{setcondispace} sont formulées, l'ordre et la disposition dans lequel elles figurent, sont en principe laissés à l'appréciation de l'utilisateur ; quel que soit l'ordre et la disposition adoptés pour les instructions \cmd{setcondispace}, les formes substituables figureront toujours dans le document généré en fonction de l'ordre dans lequel elles figurent dans le document source.
\note{Cas des contenus conditionnels imbriqués}
Lorsque l'on gère des contenus conditionnels imbriqués (\seeref{CtDoc_Commandes_CondiText_Utilisation}), une instruction \cmdn{setcondispace} présente la particularité de comportement suivante : elle est sans effet si elle désigne un contenu conditionnel de niveau inférieur à un contenu conditionnel pour lequel un espace de condition n'est pas défini.
Autrement dit, tout niveau de forme substituable supérieur à un niveau de forme substituable désigné par un espace de condition, doit être lui-même désigné par un espace de condition pour que l'espace de condition relatif au niveau inférieur soit effectif.
\subsubsection{Espace de condition à sémantique linguistique}\label{CtDoc_Commandes_SetCondiSpace_Multilingue}
Par défaut, lorsque l'on définit un espace de condition à sémantique linguistique, l'\xargn{domaine de condition}, de \xval{language}, est pris en compte implicitement et n'a pas à être spécifié. L'on peut ainsi formuler une instruction \envn{setcondispace} à sémantique linguistique sous la forme :
\codestm*{\cmd{setcondispace}[\argm{\argn{propriété de condition}}]}
Ce comportement par défaut est cependant modifié dès lors qu'un domaine de condition implicite est défini par l'utilisateur (\xcmdn{setimplicitcondifield}, \seeref{CtDoc_Commandes_SetImplicitCondiField}). Il est alors nécessaire de spécifier \emph{explicitement} \val{language} comme domaine de condition pour tout espace de condition à sémantique linguistique que l'on est amené à définir.
L'\xargn{propriété de condition} quant à lui, doit être impérativement renseigné avec l'une des appellations linguistiques en vigueur dans le \xpack{babel} (\seeref{CtDoc_Commandes_CondiText_Multilingue} pour la liste des propriétés de condition à sémantique linguistique disponibles).
\subsubsection{Version étoilée}\label{CtDoc_Commandes_SetCondiSpace_Etoile}
La \xcmdn{setcondispace} accepte l'argument~\val{*}, mais uniquement dans le cadre d'une gestion de contenu conditionnel \emph{multilingue} ; l'argument~\val{*} est sans effet sinon.
L'étoile permet de définir, relativement à une \emph{même langue} spécifiée en \xargn{propriété de condition}, conjointement un espace de condition pour les formes substituables gérées par l'\xenvn{conditext} \emph{et} un espace de condition pour les formes substituables gérées par la \xcmdn{miniconditext} (\seeref{CtDoc_Commandes_SetMiniCondiSpace_EspacesCouples}).
L'argument~\val{*} peut s'avérer efficace dans les cas où les deux types de contenus substituables coexistent de manière interdépendante dans un même document source. L'usage de l'étoile a toutefois son revers : l'instruction \cmdn{setminicondispace} (\seeref{CtDoc_Commandes_SetMiniCondiSpace}) n'apparaissant pas explicitement, cela peut être source de confusion.
De plus, dans la mesure où il ne peut exister qu'une seule instruction \cmdn{setminicondispace} dans le préambule (\seeref{CtDoc_Commandes_SetMiniCondiSpace}), il ne peut exister qu'une seule instruction \cmdn{setcondispace} avec étoile. Si plusieurs instructions de ce type sont spécifiées, le compilateur ne prendra en compte que la dernière de ces instructions, avec le risque d'effets indésirables ou inattendus.
En toute logique, l'étoile est sans effet si l'instruction \cmdn{setcondispace} est utilisée pour définir un espace de condition global (\seeref{CtDoc_Commandes_SetCondiSpace_EspaceConditionGlobal}).
\subsubsection{Espace de condition global}\label{CtDoc_Commandes_SetCondiSpace_EspaceConditionGlobal}
En plus de l'usage préalablement décrit, la \xcmdn{setcondispace} peut être utilisée sous la forme spécifique suivante :
\codestm*{\cmd{setcondispace}[\argo{\argn{domaine de condition}}\argm{}]}
\resumepar L'espace de condition alors défini, est un \emph{espace de condition global} : toutes les formes substituables rattachées à un même domaine de condition s'affichent sans exception dans le document généré.
À noter que l'utilisation de la \xcmdn{setcondispace} sous la forme \cmd{setcondispace}[\argo{}\argm{}] déclenche un message d'erreur au moment de la compilation.
Si l'on souhaite définir un espace de condition global dans un contexte de contenu conditionnel multilingue, l'\xargn{domaine de condition} doit être \emph{explicitement} renseigné avec la \xval{language}.
\subsection{Création d'un domaine de condition}\label{CtDoc_Commandes_NewCondiField}
L'on crée un domaine de condition au moyen de la \xcmdn{newcondifield}\cmdbookmark{newcondifield}, que l'on utilise sous la forme suivante :
\cmdheader{newcondifield}{\argo{*}\argm{\argn{nouveau domaine de condition}}}
\subsubsection{argument et syntaxe}
L'\xargn{nouveau domaine de condition} est à renseigner sur la base d'une valeur de type alphabétique, sans caractères accentués ou à diacritiques, et sans espaces.
Si l'\xargn{nouveau domaine de condition} est laissé vide, un message d'erreur sera déclenché lors de la compilation.
Concernant l'argument~\val{*}, \seeref{CtDoc_Commandes_NewCondiField_Etoile}.
\subsubsection{Utilisation}
Un domaine de condition est une thématique fonctionnelle permettant de rattacher différents contenus substituables à une même sémantique de gestion conditionnelle.
Ainsi, dans le cas de contenus substituables imbriqués, c'est le domaine de condition qui permet d'en gérer la profondeur avec ses différents niveaux.
La création d'un domaine de condition se fait toujours sur le nom \argn{nouveau domaine de condition}, à l'exclusion de tout autre identifiant. Une fois créé, ce nom peut être directement utilisé en premier argument de l'\xenvn{conditext} et des commandes \cmdn{setcondispace} et \cmdn{newcondiprop}, ainsi qu'en argument unique de la \xcmdn{setimplicitcondifield}.
Il y aura autant d'instructions \cmd{newcondifield} que de domaines de condition à créer. Si un domaine de condition est créé deux fois, un message d'erreur sera déclenché lors de la compilation.
Il est possible de donner un nom identique à un domaine de condition et à une propriété de condition, mais, de par les risques de confusion que cette pratique est susceptible de produire, il convient de la réserver à des besoins spécifiques (\seeref{CtDoc_Commandes_NewCondiField_Etoile}).
En toute logique, toute instruction \cmdn{newcondifield} doit impérativement précéder l'utilisation de l'\xenvn{conditext} et des commandes \cmdn{setcondispace}, \cmdn{newcondiprop} et \cmdn{setimplicitcondifield} ; dans le cas contraire, un message d'erreur sera déclenché lors de la compilation. Plus généralement, un message d'erreur sera déclenché lors de la compilation si un domaine de condition est spécifié dans une instruction \envn{conditext}, \cmdn{setcondispace} ou \cmdn{setimplicitcondifield} alors qu'il n'a pas été créé.
\subsubsection{Version étoilée}\label{CtDoc_Commandes_NewCondiField_Etoile}
La \xcmdn{newcondifield} accepte l'argument~\val{*}, qui permet de créer tout à la fois un domaine de condition \emph{et} une propriété de condition portant le même nom.
Cet usage particulier de \cmdn{setcondispace} est essentiellement destiné à une gestion conditionnelle binaire, où une seule propriété de condition suffit par domaine de condition (l'instruction \cmdn{setcondispace} faisant office de \quo{commande interrupteur}).
Il doit en principe rester modéré : aucune instruction explicite relative à la propriété de condition ainsi créée ne figurant dans le code du document, cela peut induire une certaine confusion lorsque plusieurs instructions \cmdn{newcondifield} avec étoile sont formulées, et favoriser le risque de créations de propriétés de condition en doublon si l'on n'est pas suffisamment vigilant.
\subsubsection{Modification d'un domaine de condition}
Pour modifier un domaine de condition, il conviendra d'utiliser les fonctionnalités de recherche/remplacement propres à l'éditeur \Latex utilisé, en veillant à ce que la valeur \argn{domaine de condition modifié} en argument de \cmdn{newcondifield} soit répercutée dans \emph{toutes} les instructions concernées, \envn{conditext}, \cmdn{setcondispace}, \cmdn{newcondiprop} ou encore \cmdn{setimplicitcondispace}.
\subsubsection{Suppression d'un domaine de condition}
La suppression d'un domaine de condition se pratique en retirant simplement l'instruction \cmdn{newcondifield} correspondant à ce domaine de condition. L'utilisateur veillera toutefois à ce qu'une fois cette instruction retirée, le domaine de condition concerné ne demeure spécifié dans aucune instruction \cmdn{conditext}, \cmdn{setcondispace}, \cmdn{newcondiprop} ou \cmdn{setimplicitcondispace} ; dans le cas contraire, un message d'erreur sera déclenché lors de la compilation.
\subsection{Création d'une propriété de condition}\label{CtDoc_Commandes_NewCondiProp}
L'on crée un domaine de condition au moyen de la \xcmdn{newcondifield}\cmdbookmark{newcondifield}, que l'on utilise sous la forme suivante :
\cmdheader{newcondifield}{\argo{*}\argm{\argn{nouveau domaine de condition}}}
\subsubsection{argument et syntaxe}
L'\xargn{nouveau domaine de condition} est à renseigner sur la base d'une valeur de type alphabétique, sans caractères accentués ou à diacritiques, et sans espaces.
Si l'\xargn{nouveau domaine de condition} est laissé vide, un message d'erreur sera déclenché lors de la compilation.
Concernant l'argument~\val{*}, \seeref{CtDoc_Commandes_NewCondiField_Etoile}.
\subsubsection{Utilisation}
Un domaine de condition est une thématique fonctionnelle permettant de rattacher différents contenus substituables à une même sémantique de gestion conditionnelle.
Ainsi, dans le cas de contenus substituables imbriqués, c'est le domaine de condition qui permet d'en gérer la profondeur avec ses différents niveaux.
La création d'un domaine de condition se fait toujours sur le nom \argn{nouveau domaine de condition}, à l'exclusion de tout autre identifiant. Une fois créé, ce nom peut être directement utilisé en premier argument de l'\xenvn{conditext} et des commandes \cmdn{setcondispace} et \cmdn{newcondiprop}, ainsi qu'en argument unique de la \xcmdn{setimplicitcondifield}.
Il y aura autant d'instructions \cmd{newcondifield} que de domaines de condition à créer. Si un domaine de condition est créé deux fois, un message d'erreur sera déclenché lors de la compilation.
Il est possible de donner un nom identique à un domaine de condition et à une propriété de condition, mais, de par les risques de confusion que cette pratique est susceptible de produire, il convient de la réserver à des besoins spécifiques (\seeref{CtDoc_Commandes_NewCondiField_Etoile}).
En toute logique, toute instruction \cmdn{newcondifield} doit impérativement précéder l'utilisation de l'\xenvn{conditext} et des commandes \cmdn{setcondispace}, \cmdn{newcondiprop} et \cmdn{setimplicitcondifield} ; dans le cas contraire, un message d'erreur sera déclenché lors de la compilation. Plus généralement, un message d'erreur sera déclenché lors de la compilation si un domaine de condition est spécifié dans une instruction \envn{conditext}, \cmdn{setcondispace} ou \cmdn{setimplicitcondifield} alors qu'il n'a pas été créé.
\subsubsection{Version étoilée}\label{CtDoc_Commandes_NewCondiField_Etoile}
La \xcmdn{newcondifield} accepte l'argument~\val{*}, qui permet de créer tout à la fois un domaine de condition \emph{et} une propriété de condition portant le même nom.
Cet usage particulier de \cmdn{setcondispace} est essentiellement destiné à une gestion conditionnelle binaire, où une seule propriété de condition suffit par domaine de condition (l'instruction \cmdn{setcondispace} faisant office de \quo{commande interrupteur}).
Il doit en principe rester modéré : aucune instruction explicite relative à la propriété de condition ainsi créée ne figurant dans le code du document, cela peut induire une certaine confusion lorsque plusieurs instructions \cmdn{newcondifield} avec étoile sont formulées, et favoriser le risque de créations de propriétés de condition en doublon si l'on n'est pas suffisamment vigilant.
\subsubsection{Modification d'un domaine de condition}
Pour modifier un domaine de condition, il conviendra d'utiliser les fonctionnalités de recherche/remplacement propres à l'éditeur \Latex utilisé, en veillant à ce que la valeur \argn{domaine de condition modifié} en argument de \cmdn{newcondifield} soit répercutée dans \emph{toutes} les instructions concernées, \envn{conditext}, \cmdn{setcondispace}, \cmdn{newcondiprop} ou encore \cmdn{setimplicitcondispace}.
\subsubsection{Suppression d'un domaine de condition}
La suppression d'un domaine de condition se pratique en retirant simplement l'instruction \cmdn{newcondifield} correspondant à ce domaine de condition. L'utilisateur veillera toutefois à ce qu'une fois cette instruction retirée, le domaine de condition concerné ne demeure spécifié dans aucune instruction \cmdn{conditext}, \cmdn{setcondispace}, \cmdn{newcondiprop} ou \cmdn{setimplicitcondispace} ; dans le cas contraire, un message d'erreur sera déclenché lors de la compilation.
\subsection{Définition d'un domaine de condition implicite}\label{CtDoc_Commandes_SetImplicitCondiField}
Dans certains cas, notamment lorsque de nombreux environnements \envn{conditext} doivent être utilisés avec un domaine de condition identique, il peut s'avérer pratique -- à la fois pour faciliter la saisie et rendre le code plus lisible -- que ce domaine de condition n'ait pas à être spécifié à chaque fois.
L'on peut alors définir ce domaine de condition comme \conc{domaine de condition implicite} (en anglais, \quo{implicit condition field}). Par défaut, c'est le domaine de condition \val{language} (\seeref{CtDoc_Commandes_CondiText_Multilingue}) qui est défini comme domaine de condition implicite.
L'on définit un domaine de condition implicite au moyen de la \xcmdn{implicitcondifield}\cmdbookmark{implicitcondifield}, sous la forme :
\cmdheader{setimplicitcondifield}{\argm{\argn{domaine de condition}}}
\subsubsection{Argument}
L'\xargn{domaine de condition} est à renseigner avec une valeur de type alphabétique, sans caractères accentués ou à diacritiques, et sans espaces.
Il est indispensable que \argn{domaine de condition} ait été au préalable créé (\xcmdn{newcondifield} (\seeref{CtDoc_Commandes_NewCondiField}) ; dans le cas contraire, un message d'erreur est déclenché au moment de la compilation.
De même, si l’argument \argn{domaine de condition} est laissé vide, un message d’erreur sera déclenché lors de la compilation.
\subsubsection{Utilisation}
Il ne peut exister qu'une seule instruction \cmdn{setimplicitcondifield} -- donc, un seul domaine de condition implicite -- par document source. Si plusieurs instructions de ce type sont spécifiées, le compilateur ne prendra en compte que la dernière de ces instructions, avec le risque d'effets indésirables ou inattendus.
L'instruction \cmdn{setimplicitcondifield} devra être précisée avant toute instruction \cmdn{setcondispace}.
Il est possible, bien qu'inutile, de spécifier explicitement un domaine de condition défini comme domaine de condition implicite.
Si l'utilisateur définit un domaine de condition implicite tout en ayant à gérer par ailleurs certains contenus conditionnels multilingues dans le même document source, il est alors nécessaire de spécifier \emph{explicitement} \val{language} dans les instructions \envn{conditext} et \cmdn{setcondispace} liées à cette gestion conditionnelle multilingue -- là où, par défaut, cela n'avait pas lieu d'être (\seeref{CtDoc_Commandes_CondiText_Multilingue}).
L'on peut rétablir le comportement par défaut (\val{language} comme domaine de condition implicite) : soit en retirant simplement l'instruction \cmdn{setimplicitcondispace}, soit en formulant l'instruction \cmd{setimplicitcondifield}[\argm{language}].
\section{Commandes relatives à la mini-gestion conditionnelle}
\subsection{Saisie des formes substituables pour une mini-gestion conditionnelle}\label{CtDoc_Commandes_MiniCondiText}
Toute forme substituable destinée à une mini-gestion conditionnelle doit être saisie au moyen de la \cmdn{miniconditext}.
À la différence de l'\xenvn{conditext} qui permet de gérer des formes substituables multi-paragraphiques, la \xcmdn{miniconditext} est destinée à gérer des contenus conditionnels à l'échelle paragraphique ou intra-paragraphique (mots, groupes de mots).
L'un des usages auxquels elle est destinée, est la gestion conditionnelle multilingue de termes ou d'intitulés, mais il peut aussi s'agir d'expressions à formatage conditionnel en fonction des destinataires d'un document donné etc.
Autre différence fondamentale avec l'\xenvn{conditext} : alors que, dans le cadre d'une gestion de contenu conditionnel à l'échelle multi-paragraphique, l'on peut créer et gérer autant de domaines de condition et de propriétés de condition, et utiliser autant d'\xenvn{conditext} et d'espaces de condition que souhaité, la \xcmdn{miniconditext} est limitée à 9 propriétés de condition et 9 possibilités de formes substituables et il ne peut y avoir qu'un seul espace de condition pour mini-gestion conditionnelle dans le préambule.
La \xcmdn{miniconditext}\cmdbookmark{miniconditext} s'utilise sous la forme suivante :
\cmdheader{miniconditext}{\argm{\argn{forme substituable \no 1}}\argo{\argn{forme substituable \no 2}}\argo{\argn{forme substituable \no 3}}\argo{\argn{forme substituable \no 4}}\argo{\argn{forme substituable \no 5}}\argo{\argn{forme substituable \no 6}}\argo{\argn{forme substituable \no 7}}\argo{\argn{forme substituable \no 8}}\argo{\argn{forme substituable \no 9}}}
\subsubsection{Arguments et syntaxe}
Les arguments \argn{forme substituable \no 1}, \argn{forme substituable \no 2}~etc., sont à renseigner sur la base d'une valeur de type alphanumérique représentant un ou plusieurs mots, éventuellement un paragraphe.
Les deuxième, troisième, ...neuvième arguments peuvent ne pas être renseignés, sur la base de la règle suivante : tout argument non renseigné entre deux arguments renseignés doit figurer sous la forme \argovoid{} (tout argument non renseigné positionné après le dernier argument renseigné pouvant ne pas être mentionné).
Le fait de renseigner un argument auquel est associée une propriété de condition \quo{neutre} (\seeref{CtDoc_Commandes_SetMiniCondiProp-_Utilisation}) est sans effet lors de la compilation.
\subsubsection{Utilisation}
L'on place une instruction \cmdn{miniconditext} à chaque endroit du document source où l'on souhaite que l'une des formes substituables spécifiées dans les arguments \argn{forme substituable \no 1}, \argn{forme substituable \no 2} etc., figure dans le document généré en fonction de l'espace de condition qui sera défini.
Dans un document source, il y aura autant d'instructions \cmdn{miniconditext} que de formes substituables devant être gérées conditionnellement. Les formes substituables spécifiées dans les arguments \argn{forme substituable \no 1}, \argn{forme substituable \no 2} etc. pourront être, selon les cas et les besoins, soit identiques, soit différentes d'une instruction \cmdn{miniconditext} à une autre.
\note{Forme minimale d'utilisation} La forme minimale d'utilisation de la \xcmdn{miniconditext} est :
\codestm*{\cmd{miniconditext}[\argm{\argn{forme substituable}}]}
Cela revient, dans ce cas, à pouvoir gérer l'affichage ou l'absence d'affichage d'une forme substituable donnée.
\note{Formes substituables et propriétés de condition}
La \xcmdn{miniconditext} est, de toutes les commandes fournies par le \xpack{conditext}, celle qui est la moins intuitive.
D'une part, en effet, dans un contexte de mini-gestion conditionnelle, la notion de domaine de condition n'existe pas à proprement parler ; plus exactement, \val{miniconditext} est un domaine de condition en soi.
D'autre part, à chacun des 9 arguments de la \xcmdn{miniconditext} est associée une propriété de condition, dont la particularité essentielle réside dans le fait d'être \emph{globale} à la commande elle-même (et donc \emph{à l'ensemble} des instructions relatives à cette commande).
Ces 9 propriétés au total n'apparaissent pas dans la signature de la commande, mais il convient de toujours les garder à l'esprit puisque ce sont elles qui caractérisent chaque forme substituable.
C'est également sur la base de ces propriétés de condition que l'on définit l'espace de condition permettant de désigner laquelle des 9 formes substituables doit figurer dans le document généré, pour chaque instruction \cmdn{miniconditext} placée dans le document source. Dans la version actuelle du \xpack{conditext}, il ne peut exister \emph{qu'un seul espace de condition par préambule} (\seeref{CtDoc_Commandes_SetMiniCondiSpace}).
Par défaut, la sémantique des 9 propriétés de condition est linguistique (\seeref{CtDoc_Commandes_MiniConditext_Multilingue}) mais l'on peut également redéfinir ces propriétés de condition pour les adapter à un usage spécifique (\seeref{CtDoc_Commandes_SetMiniCondiProp-_Multilingue}).
\note{Mini-gestion conditionnelle multilingue}\label{CtDoc_Commandes_MiniConditext_Multilingue}
Par défaut, la \xcmdn{miniconditext} est prévue pour gérer un contenu conditionnel multilingue.
En d'autres termes, les propriétés de condition associées aux arguments de la commande ont par défaut une sémantique linguistique, et chaque argument de la commande correspond ainsi à une langue donnée : le français pour \argn{forme substituable \no 1}, l'anglais pour \argn{forme substituable \no 2}, l'allemand pour \argn{forme substituable \no 3}, l'espagnol pour \argn{forme substituable \no 4}, l'italien pour \argn{forme substituable \no 5}, le portuguais pour \argn{forme substituable \no 6}, le néerlandais pour \argn{forme substituable \no 7}, le danois pour \argn{forme substituable \no 8} et le norvégien pour \argn{forme substituable \no 9}.
Il est possible de modifier l'ordre des langues ou les langues elles-mêmes en redéfinissant les propriétés de condition (\seeref{CtDoc_Commandes_SetMiniCondiProp-_Multilingue}).
\subsection{Redéfinition des propriétés de condition pour une mini-gestion conditionnelle}\label{CtDoc_Commandes_SetMiniCondiProp-}
À chacun des 9 arguments de la \xcmdn{miniconditext} est associée une propriété de condition, qui sert à caractériser la forme substituable correspondant à cet argument. Chacune de ces 9 propriétés de condition est, dans son association avec l'un des arguments, \emph{globale} à la commande elle-même.
Par défaut, chacun des arguments de la \xcmdn{miniconditext} est associé à une propriété de condition à sémantique linguistique. Ces propriétés de condition ont les noms respectifs suivants, dans l'ordre des arguments de la \xcmdn{miniconditext} : \val{french}, \val{english}, \val{german}, \val{spanish}, \val{italian}, \val{portuguese}, \val{dutch},\val{danish}, \val{norsk}.
Dans un contexte de mini-gestion conditionnelle multilingue, ce sont ces noms que l'on utilise pour définir l'espace de condition concerné (\seeref{CtDoc_Commandes_SetMiniCondiSpace}).
Il est possible de modifier l'ordre des langues et/ou les langues elles-mêmes, \seeref{CtDoc_Commandes_SetMiniCondiProp-_Multilingue}.
Dès lors que l'on souhaite mettre en oeuvre une mini-gestion conditionnelle dans un contexte autre que multilingue, il est nécessaire de modifier les propriétés de condition, au moyen des commandes suivantes\cmdbookmark{setminicondiprop-} : \cmdn{setminicondipropi}, \cmdn{setminicondipropii}, \cmdn{setminicondipropiii}, \cmdn{setminicondipropiv}, \cmdn{setminicondipropv}, \cmdn{setminicondipropvi}, \cmdn{setminicondipropvii}, \cmdn{setminicondipropviii} et \cmdn{setminicondipropix}.
Chacune de ces commandes sert à modifier -- l'on dira désormais \emph{redéfinir} -- une propriété de condition sur la base d'un indice de position en chiffres romains, correspondant à celui de l'argument auquel est associée la propriété de condition dans la \xcmdn{miniconditext}. Ainsi, la \xcmdn{setminicondipropi} redéfinit la propriété de condition associée au premier argument, la \xcmdn{setminicondipropii} redéfinit la propriété de condition associée au deuxième argument et ainsi de suite.
Une \xcmdn{setminicondiprop-} (où \code{-} représente \code{i}, \code{ii}, \code{iii}, \code{iv}, \code{v}, \code{vi}, \code{vii}, \code{viii} ou \code{ix}) s'utilise sous la forme :
\cmdheader{setminicondiprop-}{\argm{\argn{propriété de condition redéfinie}}}
\subsubsection{Argument et syntaxe}
L'\xargn{propriété de condition redéfinie} est à renseigner sur la base d'une valeur de type alphabétique, sans espace ni caractères accentués ou à diacritiques.
Si l'\xargn{propriété de condition redéfinie} est laissé vide, un message d'erreur sera déclenché lors de la compilation.
\subsubsection{Utilisation}\label{CtDoc_Commandes_SetMiniCondiProp-_Utilisation}
Lorsque l'on utilise une \xcmdn{setminicondiprop-}, il n'y a pas création d'une nouvelle propriété de condition, mais \emph{redéfinition} d'une des propriétés de condition existant par défaut, par modification du nom, à l'exclusion de tout autre identifiant.
Pour redéfinir les propriétés de condition, il faut toujours respecter le schéma d'instructions suivant :
\begin{itemize}
\item d'abord, une instruction \cmdn{resettingminicondiprops} ;
\item ensuite, les instructions \cmdn{setminicondiprop-}.
\end{itemize}
La \xcmdn{resettingminicondiprops}\cmdbookmark{resettingminicondiprops} est une commande particulière qui effectue certaines initialisations indispensables avant que les propriétés de condition puissent être redéfinies. Elle accepte un argument~\val{*}, réservé à la redéfinition des propriétés de condition de sémantique linguistique (\seeref{CtDoc_Commandes_SetMiniCondiProp-_Multilingue}).
De par sa fonction particulière, l'instruction \cmdn{resettingminicondiprops} est indissociable des instructions \cmdn{setminicondiprop-}. Elle doit être obligatoirement placée \emph{avant} les instructions \cmdn{setminicondiprop-}, \cmdn{miniconditext} et \cmdn{setminicondispace}. En cas de non formulation, un message d'erreur sera déclenché lors de la compilation.
\note{Principes de la redéfinition/propriétés de condition neutres}
En fonction des besoins, la redéfinition des propriétés de condition peut être \emph{totale ou partielle}. L'on ne formule que les instructions \cmdn{setminicondiprop-} relatives aux propriétés de condition qui doivent être redéfinies.
Cela signifie qu'il y a aura autant d'instructions \cmdn{setminicondiprop-} que de propriétés de condition à redéfinir. Pour rappel, toute instruction de type \cmd{setminicondiprop-}[\argmvoid{}] déclenchera un message d'erreur lors de la compilation.
Lorsque la \xcmdn{resettingminicondiprops} est utilisée sans étoile, toute propriété de condition non redéfinie (aucune instruction \cmdn{setminicondiprop-} correspondante) est considérée comme \quo{neutre}. Si une forme substituable est renseignée dans un argument de \cmdn{miniconditext} auquel est associée une propriété de condition neutre, cette forme substituable ne sera pas prise en compte lors de la génération du document.
Si une propriété de condition est redéfinie avec un nom déjà utilisé pour une autre propriété de condition, un message d'erreur sera déclenché lors de la compilation.
Si \argn{propriété de condition redéfinie} fait elle-même l'objet d'une modification dans une ou plusieurs instructions, l'utilisateur veillera à ce que cette modification soit répercutée dans \cmdn{setminicondispace} si besoin est.
Similairement, le fait de retirer une instruction \cmd{setminicondiprop-} nécessite de retirer également toute forme substituable préalablement saisie dans l'argument correspondant de \cmdn{miniconditext}.
Il convient d'être particulièrement attentif au fait que la redéfinition des propriétés de condition a des implications sémantiques (les formes substituables spécifiées dans les arguments \argn{forme substituable \no 1}, \argn{forme substituable \no 2} etc. de la \xcmdn{miniconditext}) et fonctionnelles (la propriété de condition spécifiée avec la \xcmdn{setminicondispace}).
La modification des propriétés de condition doit se faire de manière raisonnée, selon une sémantique d'ensemble. Ainsi, même si les commandes \cmdn{setminicondiprop-} l'autorisent, a priori, faire coexister des propriétés de condition d'une certaine sémantique avec d'autres de sémantique différente est source potentielle de confusion, avec les éventuels effets indésirables ou inattendus que cela peut entraîner. De même -- sauf pour un usage exotique -- il conviendra d'éviter les redéfinitions discontinues et de privilégier à tout prix de redéfinir les propriétés de condition dans l'ordre des indices.
\subsubsection{Redéfinition de propriétés de condition de sémantique linguistique}\label{CtDoc_Commandes_SetMiniCondiProp-_Multilingue}
Il est possible d'adapter la mini-gestion conditionnelle multilingue à des besoins précis, en redéfinissant tout ou partie des langues par défaut. Dans l'actuelle version du \xpack{conditext}, modifier l'ordre des langues revient à redéfinir les langues dans le nouvel ordre souhaité.
De manière générale, toute langue redéfinie doit l'être impérativement sous la forme d'une des appellations linguistiques en vigueur dans le \xpack{babel} ; autrement, un message d'erreur sera déclenché lors de la compilation.
Deux manières de faire existent, selon que l'on fait précéder les instructions \cmdn{setminicondiprop-} de l'instruction \cmdn{resettingminicondiprops} avec ou sans étoile :
Lorsque les modifications à apporter s'avèrent importantes (toutes ou une grande partie des langues à redéfinir), l'usage de la \xcmdn{resettingminicondiprops} \emph{sans étoile} est recommandée, dans la mesure où le type de réinitialisation effectuée permet une lisibilité optimale : à une instruction \cmdn{setminicondiprop-} formulée correspond une langue effective et utilisable, et toute propriété de condition non redéfinie est considérée comme une absence de langue à la compilation. Si une forme substituable est renseignée dans un argument de \cmdn{miniconditext} auquel n'est associée aucune langue, cette forme substituable n'est pas prise en compte lors de la génération du document.
Lorsque les modifications à apporter s'avèrent peu importantes (quelques langues à redéfinir, ou la permutation d'une langue avec une autre), l'on peut utiliser la \xcmdn{resettingminicondiprops} \emph{avec étoile} : dans ce cas, toute propriété de condition non redéfinie \emph{conserve l'intitulé de langue par défaut}. Cela étant, si elle permet une certaine efficacité, l'instruction \cmd{resettingminicondiprops*} n'est cependant pas exempte de défauts, notamment une lisibilité moindre pouvant favoriser certaines confusions lors des redéfinitions.
L'usage de la \xcmdn{resettingminicondiprops} avec l'argument~\val{*} doit être réservé aux propriétés de condition de sémantique linguistique ; autrement, cela ne peut être que source d'effets indésirables ou inattendus.
\subsection{Définition d'une espace de condition pour une mini-gestion conditionnelle}\label{CtDoc_Commandes_SetMiniCondiSpace}
L'on définit un espace de condition pour mini-gestion conditionnelle au moyen de la \xcmdn{setminicondispace}\cmdbookmark{setminicondispace}, sous la forme suivante :
\cmdheader{setminicondispace}{\argm{\argn{propriété de condition}}}
\subsubsection{Argument et syntaxe}
L'\xargn{propriété de condition} est à renseigner sur la base d'une valeur de type alphabétique, sans espace ni caractères accentués ou à diacritiques.
Si l'\xargn{propriété de condition redéfinie} est laissé vide, un message d'erreur sera déclenché lors de la compilation.
Toute propriété de condition spécifiée doit correspondre à l'une des 9 propriétés de condition associées aux arguments de la \xcmdn{conditext} (soit définie par défaut, soit redéfinie avec une \xcmdn{setminicondiprop-}, \seeref{CtDoc_Commandes_SetMiniCondiProp-}) ; dans le cas contraire, un message d'erreur sera systématiquement déclenché lors de la compilation.
\subsubsection{Utilisation}
Un espace de condition pour mini-gestion conditionnelle se définit sur la base d'une des 9 propriétés de condition associées aux arguments de la \cmdn{miniconditext}. C'est cette propriété de condition qui, rapportée à un test de correspondance de type \quo{égal à} strict, permet de désigner, pour chaque instruction \cmdn{miniconditext} formulée dans le document source, la forme substituable devant figurer dans le document généré.
Les 9 propriétés de condition spécifiques à la mini-gestion conditionnelles sont \emph{globales} à la \xcmdn{miniconditext} et, par conséquent, \emph{à toutes} les instructions \cmdn{miniconditext} formulées dans le document source. Il ne peut donc exister qu'une seule instruction \cmdn{setminicondispace} effective dans le préambule. Si plusieurs instructions sont spécifiées, le compilateur ne prendra en compte que la dernière de ces instructions, avec le risque d'effets indésirables ou inattendus.
Il est toutefois possible -- bien qu'il ne s'agisse pas d'une pratique régulière -- de passer outre cette limitation de principe, en plaçant des instructions \cmdn{setminicondispace} à même le document source : chacune de ces instructions devient alors effective tant qu'une autre n'est pas rencontrée. Ainsi, d'une certaine façon, plusieurs espaces de condition pour mini-gestion conditionnelle peuvent coexister linéairement parlant (au risque d'effets indésirables ou inattendus).
\subsubsection{Espaces de condition couplés}\label{CtDoc_Commandes_SetMiniCondiSpace_EspacesCouples}
Dans un contexte de gestion de contenu conditionnel \emph{multilingue}, l'usage de la \xcmdn{setcondispace} avec l'argument~\val{*} (\seeref{CtDoc_Commandes_SetCondiSpace_Etoile}) permet de définir, relativement à une \emph{même langue} spécifiée en \xargn{propriété de condition} de \cmdn{setcondispace}, à la fois un espace de condition pour les formes substituables gérées par l'\xenvn{conditext} \emph{et} un espace de condition pour les formes substituables gérées par la \xcmdn{miniconditext}.
En d'autres termes, une instruction \cmd{setminicondispace} est formulée implicitement en même temps que l'instruction \cmdn{setcondispace} elle-même.
L'argument~\val{*} peut s'avérer efficace dans les cas où les deux types de contenus substituables coexistent de manière interdépendante dans un même document source. L'usage de l'étoile a toutefois son revers : l'instruction \cmdn{setminicondispace} n'apparaissant pas explicitement, cela peut être source de confusion.
De plus, dans la mesure où il ne peut exister qu'une seule instruction \cmdn{setminicondispace} dans le préambule, il ne peut exister qu'une seule instruction \cmdn{setcondispace*}. Si plusieurs instructions de ce type sont spécifiées, le compilateur ne prendra en compte que la dernière de ces instructions, avec le risque d'effets indésirables ou inattendus.
\part{Tutoriel : exemples commentés}\label{CtDoc_Tuto}
L'une des principales applications du texte conditionnel résidant dans la production de documents multilingues, c'est ce genre de document que le \xpack{conditext} permet de gérer par défaut, sans nécessiter de préalable d'aucune sorte.
Dans ce tutoriel, nous commencerons précisément avec un exemple de document multilingue, qui nous familiarisera avec les notions de formes substituables, de domaines de condition, de propriétés de condition et d'espaces de condition. Ce premier exemple sera l'occasion de présenter quelques bonnes pratiques d'utilisation quant aux principales commandes du paquet.
Nous passerons ensuite à un exemple où nous créerons cette fois des domaines de condition et des propriétés de condition. Nous verrons également avec ce deuxième exemple comment l'on peut imbriquer des formes substituables dans d'autres formes substituables et gérer ainsi une certaine \quo{profondeur} de contenu conditionnel.
Enfin, dans un troisième exemple, en deux parties, nous apprendrons à utiliser un ensemble de commandes permettant une mini-gestion conditionnelle, portant sur des formes substituables minimales.
\note{Remarque} Pour les besoins de certains de ces exemples, nous serons amenés à créer quelques commandes personnalisées. À cette occasion, nous adopterons la syntaxe propre au \xpack{xparse}, assez intuitive et dont la lisibilité est un atout dans le cadre d'un tutoriel. Dans nos exemples, l'instruction pour créer les commandes concernées aura toujours la forme suivante :
\codestm*{\cmd{NewDocumentCommand}[\cmdn{\argn{nom de la commande}}\argm{\argn{arguments}}\argm{\argn{code}}]}
\resumepar où \argn{arguments} représente les arguments qui doivent figurer dans le code : \val{m} (pour \quo{mandatory}) et \val{o} (pour \quo{optional}). Un argument optionnel peut avoir une valeur par défaut ; dans ce cas, il est représenté par \val{O}\argm{\argn{valeur par défaut}}.
Tous les exemples de document source présentés dans le tutoriel sont directement utilisables et compilables ; la manière dont ils sont présentés n'a, en tant que telle, rien d'impératif.
\section{Exemple commenté \no 1 : un document en version multilingue}
Imaginons -- de manière quelque peu artificielle il est vrai -- que nous ayons à rédiger dans un seul et même document source, un texte en version française, anglaise, allemande, espagnole et italienne, avec pour objectif de générer ensuite un document par version linguistique de ce texte.
Pour des raisons de commodité, nous prendrons ici pour texte l'article premier de la \titcit{Déclaration des droits de l'homme}, décliné respectivement en français, anglais, allemand, espagnol et italien. À noter toutefois que le \xpack{conditext} permet de gérer des textes conditionnels de plusieurs dizaines à plusieurs milliers de signes.
\tutostep
Voici le document source correspondant à notre exemple :
\begin{codeblock}
\codestm{\cmd{documentclass}[\argm{article}]}
\codestm{\cmd{usepackage}[\argo{english,german,spanish,italian,french}\argm{babel}]}
\codestm{\cmd{usepackage}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{document}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{french}]}
\begin{subcodeblock}
\codestm{Tous les êtres humains naissent libres et égaux en dignité et en droits. Ils sont doués de raison et de conscience et doivent agir les uns envers les autres dans un esprit de fraternité.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{english}]}
\begin{subcodeblock}
\codestm{All human beings are born free and equal in dignity and rights. They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{german}]}
\begin{subcodeblock}
\codestm{Alle Menschen sind frei und gleich an Würde und Rechten geboren. Sie sind mit Vernunft und Gewissen begabt und sollen einander im Geist der Brüderlichkeit begegnen.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{spanish}]}
\begin{subcodeblock}
\codestm{Todos los seres humanos nacen libres e iguales en dignidad y derechos y, dotados como están de razón y conciencia, deben comportarse fraternalmente los unos con los otros.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{italian}]}
\begin{subcodeblock}
\codestm{Tutti gli esseri umani nascono liberi ed eguali in dignità e diritti. Essi sono dotati di ragione e di coscienza e devono agire gli uni verso gli altri in spirito di fratellanza.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{end}[\argm{document}]}
\end{codeblock}
L'on remarquera tout d'abord que chaque version linguistique du texte est placée dans un environnement nommé \envn{conditext}, et se voit spécifier le nom de la langue dans laquelle elle est rédigée, sous la forme d'un argument de type obligatoire.
Cet argument correspond à une \conc{propriété de condition}, c'est-à-dire une caractérisation fonctionnelle sur la base de laquelle l'on pourra ensuite désigner quelle version de texte doit être générée. Dans le cas de notre exemple, il s'agit de propriétés à sémantique linguistique, prédéfinies et fournies par le \xpack{conditext}. Il est possible de créer et utiliser des propriétés de condition de toute nature, comme nous le verrons \seeref{CtDoc_Tuto_Multicondition}.
Dans le cas d'un contenu conditionnel multilingue, l'\xenvn{conditext} n'utilise qu'un seul argument. En principe, il existe un second argument, optionnel celui-là, servant à spécifier le domaine de condition, mais pour l'instant, il suffit de retenir que c'est l'argument obligatoire qui permet de spécifier la propriété de condition.
De manière générale, tout texte que l'on souhaite gérer comme \emph{forme substituable} doit être placé dans un \xenvn{conditext}. Dans un même document source, il peut être spécifié autant d'environnements \envn{conditext} que souhaité, y compris avec des propriétés de condition (et des domaines de condition) identiques.
Ainsi, dans notre exemple, l'on pourrait faire figurer toute la \titcit{Déclaration des droits de l'homme}, avec chacun des articles présenté en version linguistique distincte (nous verrons plus bas que, s'il peut sembler a priori plus pratique de regrouper tous les articles d'une même version linguistique dans un même \xenvn{conditext}, le partitionnement permet dans certains cas une gestion conditionnelle plus précise).
Les propriétés de condition de notre exemple ont respectivement la valeur \val{french}, \val{english}, \val{german}, \val{spanish} et \val{italian}. Lorsqu'il s'agit de texte conditionnel multilingue, les propriétés de condition doivent impérativement correspondre aux appellations linguistiques utilisées par le \xpack{babel}. Il est indispensable que ce paquet soit déclaré dans le préambule, accompagné des langues susceptibles d'être spécifiées comme propriétés de condition. Pour les besoins de notre exemple, le préambule contient donc la déclaration suivante :
\begin{codeblock}
\codestm{\cmd{usepackage}[\argo{english,german,spanish,italian,french}\argm{babel}]}
\end{codeblock}
\resumepar (faute de quoi, le compilateur produit un message d'erreur).
\tutostep
Si nous compilons le document source en l'état, le document généré... est vide (ou ne s'affiche pas, selon l'éditeur \Latex utilisé). Ceci est logique, en ce sens où il manque en effet l'instruction permettant de désigner quelle forme substituable doit figurer sur le document. En l'absence de cette instruction, aucun contenu d'\xenvn{conditext} ne figure dans le document généré.
Partons de l'idée de générer un document avec la version italienne de l'article premier de la \titcit{Déclaration des droits de l'homme}. Pour ce faire, dans le préambule, à la suite de la déclaration des paquets, nous allons ajouter la ligne suivante :
\begin{codeblock}
\codestm{\cmd{setcondispace}[\argm{italian}]}
\end{codeblock}
Si nous compilons à nouveau le document source, c'est désormais le texte suivant qui figure conformément à nos attentes dans le document généré :
\begin{ltext}
\ltextline{Tutti gli esseri umani nascono liberi ed eguali in dignità e diritti. Essi sono dotati di ragione e di coscienza e devono agire gli uni verso gli altri in spirito di fratellanza.}\end{ltext}
Si nous souhaitons maintenant générer un document avec la version française, il suffit de modifier l'instruction initiale en :
\begin{codeblock}
\codestm{\cmd{setcondispace}[\argm{french}]}
\end{codeblock}
\resumepar et de recompiler le document source. L'on obtient alors :
\begin{ltext}
\ltextline{Tous les êtres humains naissent libres et égaux en dignité et en droits. Ils sont doués de raison et de conscience et doivent agir les uns envers les autres dans un esprit de fraternité.}\end{ltext}
\resumepar Et ainsi de suite...
L'instruction \cmdn{setcondispace} définit un \emph{espace de condition}. Dans les deux cas précédents, ce sont les valeurs \val{italian} et \val{french} qui sont spécifiées en argument de \cmdn{setcondispace} afin de sélectionner : dans le premier cas, la forme substituable correspondant au contenu de l'\xenvn{conditext} ayant \val{italian} spécifié en argument, et dans le deuxième cas, la forme substituable correspondant au contenu de l'\xenvn{conditext} ayant \val{french} spécifié en argument.
Plus précisément, un espace de condition repose sur un test de correspondance de type \quo{égal à} strict, entre une propriété de condition spécifiée en argument d'une instruction \envn{setcondispace} et une propriété de condition spécifiée en argument d'une instruction \cmdn{conditext}. Si aucune correspondance n'existe, l'instruction \cmdn{setcondispace} est sans effet (tout se passe comme s'il n'y avait pas d'instruction formulée) ; sinon, la correspondance existante permet de désigner une ou plusieurs formes substituables pour figurer dans le document généré.
Dans le cas d'une gestion conditionnelle multilingue, la \xcmdn{setcondispace} n'utilise qu'un seul argument (la propriété de condition). En principe, un second argument, optionnel, permet de spécifier le domaine de condition -- le test de correspondance portant alors à la fois sur le domaine de condition et la propriété de condition.
\tutostep
Les instructions \envn{conditext} et \cmdn{setcondispace} de notre exemple répondent à notre besoin initial. Imaginons maintenant -- à nouveau, de manière assez artificielle -- que nous ayons à générer les versions anglaise, allemande et espagnole du texte dans un seul et même document, sans les versions française et italienne.
La solution est simple : il suffit dans ce cas de spécifier autant d'instructions \cmd{condispace} que de langues concernées. Dans le préambule, à la place de \cmd{setcondispace}[\argm{italian}], nous aurons donc :
\begin{codeblock}
\codestm{\cmd{setcondispace}[\argm{english}]}
\codestm{\cmd{setcondispace}[\argm{german}]}
\codestm{\cmd{setcondispace}[\argm{spanish}]}
\end{codeblock}
Désormais, le document généré contient le texte :
\begin{ltext}
\ltextline{All human beings are born free and equal in dignity and rights. They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.}
\ltextline{}
\ltextline{Alle Menschen sind frei und gleich an Würde und Rechten geboren. Sie sind mit Vernunft und Gewissen begabt und sollen einander im Geist der Brüderlichkeit begegnen.}
\ltextline{}
\ltextline{Todos los seres humanos nacen libres e iguales en dignidad y derechos y, dotados como están de razón y conciencia, deben comportarse fraternalmente los unos con los otros.}
\end{ltext}
Ainsi qu'on peut le constater, il peut être formulé plusieurs instructions \cmd{setcondispace} en fonction des besoins. En principe, ces instructions peuvent être indifféremment dans un ordre ou dans un autre ; ainsi, \cmd{setcondispace}[\argm{german}] aurait très bien pu précéder \cmd{setcondispace}[\argm{english}] sans provoquer une présentation différente du texte dans le document généré. En fait, le texte qui figure dans le document généré respecte toujours l'ordre et la disposition adoptés dans le document source ; d'un certain point de vue, c'est l'une des limites (actuelles ?) du \xpack{conditext}.
\tutostep
Nous allons maintenant étoffer notre exemple de départ, en insérant, à la suite de chaque version française, anglaise, allemande, espagnole et italienne de l'article premier de la \titcit{Déclaration des droits de l'homme}, le texte de l'article 2 décliné dans les mêmes langues. Le document source est désormais le suivant, hors préambule :
\begin{codeblock}
\codestm{\cmd{begin}[\argm{document}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{french}]}
\begin{subcodeblock}
\codestm{Tous les êtres humains naissent libres et égaux en dignité et en droits. Ils sont doués de raison et de conscience et doivent agir les uns envers les autres dans un esprit de fraternité.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{french}]}
\begin{subcodeblock}
\codestm{Chacun peut se prévaloir de tous les droits et de toutes les libertés proclamés dans la présente Déclaration, sans distinction aucune, notamment de race, de couleur, de sexe, de langue, de religion, d'opinion politique ou de toute autre opinion, d'origine nationale ou sociale, de fortune, de naissance ou de toute autre situation.\\De plus, il ne sera fait aucune distinction fondée sur le statut politique, juridique ou international du pays ou du territoire dont une personne est ressortissante, que ce pays ou territoire soit indépendant, sous tutelle, non autonome ou soumis à une limitation quelconque de souveraineté.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{english}]}
\begin{subcodeblock}
\codestm{All human beings are born free and equal in dignity and rights. They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{english}]}
\begin{subcodeblock}
\codestm{Everyone is entitled to all the rights and freedoms set forth in this Declaration, without distinction of any kind, such as race, colour, sex, language, religion, political or other opinion, national or social origin, property, birth or other status.\\Furthermore, no distinction shall be made on the basis of the political, jurisdictional or international status of the country or territory to which a person belongs, whether it be independent, trust, non-self-governing or under any other limitation of sovereignty.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{german}]}
\begin{subcodeblock}
\codestm{Alle Menschen sind frei und gleich an Würde und Rechten geboren. Sie sind mit Vernunft und Gewissen begabt und sollen einander im Geist der Brüderlichkeit begegnen.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{german}]}
\begin{subcodeblock}
\codestm{Jeder hat Anspruch auf die in dieser Erklärung verkündeten Rechte und Freiheiten ohne irgendeinen Unterschied, etwa nach Rasse, Hautfarbe, Geschlecht, Sprache, Religion, politischer oder sonstiger Überzeugung, nationaler oder sozialer Herkunft, Vermögen, Geburt oder sonstigem Stand.\\Des weiteren darf kein Unterschied gemacht werden auf Grund der politischen, rechtlichen oder internationalen Stellung des Landes oder Gebiets, dem eine Person angehört, gleichgültig ob dieses unabhängig ist, unter Treuhandschaft steht, keine Selbstregierung besitzt oder sonst in seiner Souveränität eingeschränkt ist.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{spanish}]}
\begin{subcodeblock}
\codestm{Todos los seres humanos nacen libres e iguales en dignidad y derechos y, dotados como están de razón y conciencia, deben comportarse fraternalmente los unos con los otros.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{spanish}]}
\begin{subcodeblock}
\codestm{Toda persona tiene los derechos y libertades proclamados en esta Declaración, sin distinción alguna de raza, color, sexo, idioma, religión, opinión política o de cualquier otra índole, origen nacional o social, posición económica, nacimiento o cualquier otra condición.\\Además, no se hará distinción alguna fundada en la condición política, jurídica o internacional del país o territorio de cuya jurisdicción dependa una persona, tanto si se trata de un país independiente, como de un territorio bajo administración fiduciaria, no autónomo o sometido a cualquier otra limitación de soberanía.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{italian}]}
\begin{subcodeblock}
\codestm{Tutti gli esseri umani nascono liberi ed eguali in dignità e diritti. Essi sono dotati di ragione e di coscienza e devono agire gli uni verso gli altri in spirito di fratellanza.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{\cmd{begin}[\argm{conditext}\argm{italian}]}
\begin{subcodeblock}
\codestm{Ad ogni individuo spettano tutti i diritti e tutte le libertà enunciate nella presente Dichiarazione, senza distinzione alcuna, per ragioni di razza, di colore, di sesso, di lingua, di religione, di opinione politica o di altro genere, di origine nazionale o sociale, di ricchezza, di nascita o di altra condizione.\\Nessuna distinzione sarà inoltre stabilita sulla base dello statuto politico, giuridico o internazionale del paese o del territorio cui una persona appartiene, sia indipendente, o sottoposto ad amministrazione fiduciaria o non autonomo, o soggetto a qualsiasi limitazione di sovranità.}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{end}[\argm{document}]}
\end{codeblock}
Le document source contient maintenant deux environnements \envn{conditext} par langue concernée, l'un pour l'article premier et l'autre pour l'article 2 de la \titcit{Déclaration des droits de l'homme}.
D'après ce que nous avons vu précédemment, si par exemple le document généré doit contenir les deux premiers articles respectivement en français et en espagnol, il suffit de formuler dans le préambule les instructions
\begin{codeblock}
\codestm{\cmd{setcondispace}[\argm{french}]}
\codestm{\cmd{setcondispace}[\argm{spanish}]}
\end{codeblock}
\resumepar et l'on obtient alors dans le document généré :
\begin{ltext}
\ltextline{Tous les êtres humains naissent libres et égaux en dignité et en droits. Ils sont doués de raison et de conscience et doivent agir les uns envers les autres dans un esprit de fraternité.}
\ltextline{}
\ltextline{Chacun peut se prévaloir de tous les droits et de toutes les libertés proclamés dans la présente Déclaration, sans distinction aucune, notamment de race, de couleur, de sexe, de langue, de religion, d'opinion politique ou de toute autre opinion, d'origine nationale ou sociale, de fortune, de naissance ou de toute autre situation.\\De plus, il ne sera fait aucune distinction fondée sur le statut politique, juridique ou international du pays ou du territoire dont une personne est ressortissante, que ce pays ou territoire soit indépendant, sous tutelle, non autonome ou soumis à une limitation quelconque de souveraineté.}
\ltextline{}
\ltextline{Todos los seres humanos nacen libres e iguales en dignidad y derechos y, dotados como están de razón y conciencia, deben comportarse fraternalmente los unos con los otros.}
\ltextline{}
\ltextline{Toda persona tiene los derechos y libertades proclamados en esta Declaración, sin distinción alguna de raza, color, sexo, idioma, religión, opinión política o de cualquier otra índole, origen nacional o social, posición económica, nacimiento o cualquier otra condición.\\Además, no se hará distinción alguna fundada en la condición política, jurídica o internacional del país o territorio de cuya jurisdicción dependa una persona, tanto si se trata de un país independiente, como de un territorio bajo administración fiduciaria, no autónomo o sometido a cualquier otra limitación de soberanía.}
\end{ltext}
Il peut sembler peu judicieux d'avoir dans notre document source autant d'environnements \envn{conditext} qu'il est d'articles et de versions d'article, alors que l'on pourrait ne créer qu'un environnement pour les articles en langue française, un autre pour les articles en langue anglaise etc. Cette organisation textuelle s'avère cependant nécessaire chaque fois qu'il s'agit de gérer les formes substituables au plus près.
Supposons justement qu'à partir de notre document source, pour une raison donnée, nous devions présenter dans le document généré uniquement l'article~2 de la \titcit{Déclaration des droits de l'homme} en français et en espagnol. Telles quelles, les instructions \cmdn{setcondispace} spécifiées précédemment ne le permettent pas -- et le permettraient encore moins si les articles étaient regroupés par langue dans un même environnement.
En fait, l'\xenvn{conditext} accepte une étoile en troisième argument, que l'on utilise sous la forme atypique suivante :
\begin{codeblock}
\codestm{\cmd{begin}[\argm{conditext}\argm{french}]*}
\codestm{Tous les êtres humains naissent libres et égaux en dignité et en droits. Ils sont doués de raison et de conscience et doivent agir les uns envers les autres dans un esprit de fraternité.\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{spanish}]*}
\codestm{Todos los seres humanos nacen libres e iguales en dignidad y derechos y, dotados como están de razón y conciencia, deben comportarse fraternalmente los unos con los otros.\cmd{end}[\argm{conditext}]}
\end{codeblock}
\resumepar Dans ce cas précis, l'étoile indique que l'article~2 de la \titcit{Déclaration des droits de l'homme} en français et en espagnol doit être ignoré par les instructions respectives \cmd{setcondispace}[\argm{french}] et \cmd{setcondispace}[\argm{spanish}].
D'une façon plus générale, l'astérisque d'un \xenvn{conditext} -- dont la position atypique signifie que c'est la \emph{prise en compte de la propriété de condition} qui est affectée -- permet : soit de ne pas faire figurer dans le document généré une forme substituable normalement désignée pour y figurer, soit à l'inverse de faire figurer dans le document généré une forme substituable qui n'est en principe pas désignée pour y figurer.
\tutostep
Nous voici désormais familiarisés avec l'\xenvn{conditext} et la \xcmdn{setcondispace}, deux dispositifs fondamentaux du \xpack{conditext}. Avant d'aller plus loin et d'aborder la création de domaines de condition et de propriétés de condition, indispensable dès que l'on a un besoin d'une gestion de contenu conditionnelle spécifique, ajoutons encore deux points.
Ainsi que cela a été précisé au début de cet exemple, tant qu'aucun espace de condition n'est défini, aucun contenu d'\xenvn{conditext} ne figure dans le document généré. Ceci correspond en fait à un comportement par défaut proposé par le \xpack{conditext}. Il est possible de le modifier en déclarant le \xpack{conditext} avec l'\xvalopt{defaultdisplayall} sous la forme :
\codestm*{\cmd{usepackage}[\argo{defaultdisplayall}\argm{conditext}]}
En outre -- même si cette pratique n'est pas véritablement régulière, et encore moins efficace dans un document source de taille importante comportant beaucoup d'instructions \envn{conditext} --, il est possible d'utiliser l'argument~\val{*} propre aux environnements \envn{conditext} \emph{sans définir d'espace de condition}, afin de forcer \quo{directement} l'affichage ou le non affichage d'une ou plusieurs formes substituables dans le document généré.
\section{Exemple commenté d'utilisation \no 2 : un document à gestion conditionnelle multiple}\label{CtDoc_Tuto_Multicondition}
Pour les besoins de ce nouvel exemple, nous partons sur l'idée que nous avons à rédiger un document préparatoire relatif à un projet d'application informatique, comportant des illustrations, avec du contenu textuel fixe et du contenu textuel différencié par département (ici, le développement, la conception de la base de données et la conception graphique). Un document devra être généré pour chacun de ces départements avec en outre, pour chaque département concerné, une version avec illustrations et un version sans illustration. Nous sommes dans le cas typique d'une gestion conditionnelle multiple.
Pour des raisons de commodité, nous représenterons le texte sous la forme de quelques paragraphes en latin simulé. Les illustrations correspondront à des fichiers image, simulés eux aussi, et supposés être placés dans le même répertoire que celui du document source.
\tutostep
À part pour la gestion conditionnelle multilingue (que nous avons abordée dans l'exemple précédent) et pour une gestion conditionnelle généraliste (qui ne sera pas abordée dans ce tutoriel), \pack{conditext} ne fournit aucun autre élément prédéfini, mais offre la possibilité d'en créer à volonté pour répondre aux besoins de gestion de contenu conditionnel les plus spécifiques.
En un premier temps, nous allons créer les domaines de condition et les propriétés de condition nécessaires à la gestion conditionnelle de notre exemple.
Pour rappel, un domaine de condition est une thématique fonctionnelle sous laquelle l'on peut regrouper les formes substituables qui sont liées par une même sémantique. Il nous faut deux domaines de condition, l'un pour une thématique \quo{départements} et l'autre pour une thématique \quo{présentation}. Nous les créons au moyen des instructions suivantes, placées dans le préambule :
\begin{codeblock}
\codestm{\cmd{newcondifield}[\argm{departement}]}
\codestm{\cmd{newcondifield}[\argm{presentation}]}
\end{codeblock}
La forme des noms \val{departement} et \val{presentation} (de même que celle des intitulés de propriétés de condition définis plus bas) n'est peut-être pas la plus judicieuse possible mais elle suffit pour notre exemple. De manière générale, le choix de l'intitulé d'un domaine de condition ou d'une propriété de condition est laissé à l'appréciation de l'utilisateur, avec cela que l'on ne peut utiliser que des caractères alphabétiques, avec ou sans majuscules, sans espace, sans caractères accentués ou à diacritiques.
Passons maintenant aux propriétés de condition. Pour rappel, une propriété de condition permet de caractériser fonctionnellement chaque forme substituable d'un domaine de condition donné. Nous créons celles relatives aux départements au moyen des instructions suivantes :
\begin{codeblock}
\codestm{\cmd{newcondiprop}[\argm{departement}\argm{develop}]}
\codestm{\cmd{newcondiprop}[\argm{departement}\argm{bdonnees}]}
\codestm{\cmd{newcondiprop}[\argm{departement}\argm{graphisme}]}
\end{codeblock}
\resumepar Il y a une propriété de condition par département, puisque dans le cadre de notre exemple, la gestion conditionnelle par départements implique que toute forme substituable du domaine de condition \val{departement} soit susceptible de concerner soit le développement, soit la conception de la base de données, soit encore la conception graphique. Lorsque l'on crée une propriété de condition, outre le nom de la propriété en tant que telle, il faut \emph{systématiquement spécifier le domaine de condition} auquel l'on souhaite rattacher la propriété de condition concernée.
La gestion conditionnelle avec et sans illustration nécessite, elle, une réflexion préliminaire. L'on pourrait être tenté en effet de définir d'emblée deux propriétés de condition, l'une pour caractériser les formes substituables avec illustration, et l'autre, les formes substituables sans illustration. Or, dans ce cas, cela reviendrait à devoir par la suite définir un espace de condition testant les formes substituables avec illustration et une espace de condition testant les formes substituables sans illustration, soit un test en doublon inversé, inutile et surtout source potentielle de confusion.
De manière générale, dans le cas d'une gestion conditionnelle binaire (avec/sans etc.), une seule propriété de condition s'avère la plupart du temps suffisante. Relativement au domaine de condition \val{presentation}, nous ne créons donc qu'une seule propriété de condition au moyen de l'instruction suivante :
\begin{codeblock}
\codestm{\cmd{newcondiprop}[\argm{presentation}\argm{illustr}]}
\end{codeblock}
En résumé, la création de domaines de condition s'effectue au moyen de la \xcmdn{newcondifield} ; celle des propriétés de condition, au moyen de la \xcmdn{newcondiprop}.
À noter que les instructions \cmdn{newcondifield} et \cmdn{newcondiprop} doivent obligatoirement figurer avant toute autre instruction : si, dans un \xenvn{conditext} ou une commande telle que \cmdn{setcondispace}, l'on spécifie un domaine de condition ou une propriété de condition non créée préalablement, un message d'erreur sera déclenché lors de la compilation.
\tutostep
Voici maintenant le document source de notre exemple, incluant les précédentes instructions :
\begin{codeblock}
\codestm{\cmd{documentclass}[\argm{article}]}
\codestm{\cmd{usepackage}[\argo{french}\argm{babel}]}
\codestm{\cmd{usepackage}[\argm{graphicx}]}
\codestm{\cmd{usepackage}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{newcondifield}[\argm{departement}]}
\codestm{\cmd{newcondifield}[\argm{presentation}]}
\codestm{\cmd{newcondiprop}[\argm{departement}\argm{develop}]}
\codestm{\cmd{newcondiprop}[\argm{departement}\argm{bdonnees}]}
\codestm{\cmd{newcondiprop}[\argm{departement}\argm{graphisme}]}
\codestm{\cmd{newcondiprop}[\argm{presentation}\argm{illustr}]}
\codestm{}
\codestm{\cmd{begin}[\argm{document}]
\codestm{}
\codestm{\lipsum[1][1-5]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argo{presentation}\argm{illustr}]}
\begin{subcodeblock}
\codestm{\cmd{includegraphics}[\argm{image1}]}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argo{departement}\argm{bdonnees}]}
\begin{subcodeblock}
\codestm{\lipsum[2][1-3]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argo{presentation}\argm{illustr}]}
\begin{subcodeblock}
\codestm{\cmd{includegraphics}[\argm{image2}]}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\lipsum[2][4-5]}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argo{departement}\argm{develop}]}
\begin{subcodeblock}
\codestm{\lipsum[3][1-3]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argo{presentation}\argm{illustr}]}
\begin{subcodeblock}
\codestm{\cmd{includegraphics}[\argm{image3}]}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\lipsum[3][4-5]}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argo{departement}\argm{develop}]}
\begin{subcodeblock}
\codestm{\lipsum[4][1-5]}
\end{subcodeblock}
\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argo{departement}\argm{graphisme}]}
\begin{subcodeblock}
\codestm{\lipsum[5][1-3]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argo{presentation}\argm{illustr}]}
\begin{subcodeblock}
\codestm{\cmd{includegraphics}[\argm{image4}]}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\lipsum[5][4-5]}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\lipsum[6][1-3]}
\codestm{}
\codestm{\cmd{end}[\argm{document}]}
\end{codeblock}
\resumepar (Le \xpack{graphicx} est nécessaire pour pouvoir utiliser la \xcmdn{includegraphics} permettant l'insertion des images dans le document.)
Remarquons avant tout que les environnements \envn{conditext} relatifs à la gestion conditionnelle des illustrations sont \emph{imbriqués} dans les environnements \envn{conditext} relatifs à la gestion conditionnelle des textes à destination des différents départements.
L'on peut ainsi à volonté et dans les limites de l'utilité, imbriquer différents environnements \envn{conditext}. La sémantique d'imbrication et son niveau de \emph{profondeur} sont laissés à l'appréciation de l'utilisateur -- la seule contrainte étant que l'on ne peut imbriquer des environnments \envn{conditext} avec un même domaine de condition, sous risque d'effets inattendus ou indésirables.
Pour l'instant, aucun espace de condition n'est défini, ce qui signifie que si le document source est compilé tel quel, seuls, les premier et dernier paragraphes figureront dans le document généré, puisqu'ils ne sont placés dans aucun \xenvn{conditext} (pour rappel, par défaut, en l'absence d'un espace de condition défini, aucune forme substituable ne figure dans le document généré).
\tutostep
Supposons que nous ayons à générer un document comportant le texte spécifique au développement, accompagné de son illustration. Deux espaces de condition nécessitent d'être créés, l'un pour gérer le texte spécifique au développement et l'autre, pour gérer l'illustration, soit :
\begin{codeblock}
\codestm{\cmd{setcondispace}[\argo{departement}\argm{develop}]}
\codestm{\cmd{setcondispace}[\argo{presentation}\argm{illustr}]}
\end{codeblock}
De la sorte, après compilation, le document généré contient, conformément à nos attentes :
\begin{ltext}
\ltextline{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus
elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dic-
tum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id,
vulputate a, magna. Donec vehicula augue eu neque.}
\ltextline{}
\ltextline{(image1)}
\ltextline{}
\ltextline{Nulla malesuada porttitor diam. Donec felis erat, congue non, vo-
lutpat at, tincidunt tristique, libero. Vivamus viverra fermentum felis.}
\ltextline{}
\ltextline{(image3)}
\ltextline{}
\ltextline{Donec nonummy pellentesque ante. Phasellus adipiscing semper elit.}
\ltextline{}
\ltextline{Quisque ullamcorper placerat ipsum. Cras nibh. Morbi vel justo vi-
tae lacus tincidunt ultrices. Lorem ipsum dolor sit amet, consectetuer
adipiscing elit. In hac habitasse platea dictumst.}
\ltextline{}
\ltextline{Suspendisse vel felis. Ut lorem lorem, interdum eu, tincidunt sit amet,
laoreet vitae, arcu. Aenean faucibus pede eu ante.}
\end{ltext}
Si nous ne souhaitons aucune illustration dans le document généré, il suffit alors de retirer l'instruction \cmd{setcondispace}[\argo{presentation}\argm{illustr}].
Maintenant, pour une raison donnée, nous pourrions vouloir exclure l'illustration accompagnant le contenu textuel spécifique au développement, mais conserver celle qui accompagne le contenu textuel fixe. Deux solution existent dans ce cas, la première étant plus \quo{lisible} que la seconde :
Soit l'on maintient l'instruction \cmd{setcondispace}[\argo{presentation}\argm{illustr}] et l'on utilise l'étoile en troisième argument de l'\xenvn{conditext} qui gère l'illustration de la forme substituable relative au développement, sous la forme :
\begin{codeblock}
\codestm{\cmd{begin}[\argm{conditext}\argo{presentation}\argm{illustr}*]}
\begin{subcodeblock}
\codestm{\cmd{includegraphics}[\argm{image3}]}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\end{codeblock}
Soit l'on retire l'instruction \cmd{setcondispace}[\argo{presentation}\argm{illustr}] et l'on utilise l'étoile en troisième argument de l'\xenvn{conditext} qui gère l'illustration du contenu textuel \emph{fixe}, sous la forme :
\begin{codeblock}
\codestm{\cmd{begin}[\argm{conditext}\argo{presentation}\argm{illustr}*]}
\begin{subcodeblock}
\codestm{\cmd{includegraphics}[\argm{image1}]}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\end{codeblock}
De manière générale, lorsque l'on est amené à modifier individuellement la prise en compte d'un domaine et d'une propriété de condition dans une instruction \envn{conditext}, il est préférable pour des raisons de lisibilité de le faire dans un contexte d'espace de condition défini, plutôt qu'en l'absence d'espace de condition.
\tutostep
Ce présent exemple nous a familiarisés avec la création de domaines de condition et de propriétés de condition, ainsi qu'avec la pratique d'instructions \envn{conditext} imbriquées.
Avant de poursuivre avec un troisième et dernier exemple, et d'y aborder l'utilisation de la commande la plus particulière du \xpack{conditext}, voici quelques remarques complémentaires.
Dans les documents longs à contenu conditionnel, les formes substituables peuvent être nombreuses, et par la même occasion, un certain nombre d'instructions \envn{conditext} est susceptible de figurer dans le document source, impliquant une saisie fastidieuse lorsqu'il s'agit notamment de spécifier un même domaine de condition de multiples fois.
Certes, l'on peut utiliser, dans ce cas comme dans bien d'autres d'ailleurs, les fonctions copier-coller de l'éditeur \Latex utilisé. Toutefois, le \xpack{conditext} propose la possibilité d'utiliser un \conc{domaine de condition implicite}, à raison d'un par document source -- ce qui, outre d'exonérer l'utilisateur d'une saisie fastidieuse, rend aussi le code plus lisible dans la plupart des cas.
Pour reprendre notre exemple, si nous souhaitons ne pas avoir à saisir (et ne pas voir figurer) le domaine de condition \val{departement} dans les instructions \envn{conditext}, nous pouvons ajouter l'instruction suivante dans le préambule :
\begin{codeblock}
\codestm{\cmd{setimplicitcondifield}[\argm{departement}]}
\end{codeblock}
Désormais, toutes les instructions \envn{conditext} permettant de gérer les formes substituables propres aux différents départements pourront avoir la forme suivante :
\begin{codeblock}
\codestm{\cmd{begin}[\argm{conditext}\argm{develop}]}
\end{codeblock}
\resumepar ou
\begin{codeblock}
\codestm{\cmd{begin}[\argm{conditext}\argm{bdonnees}]}
\end{codeblock}
\resumepar ou
\begin{codeblock}
\codestm{\cmd{begin}[\argm{conditext}\argm{graphisme}]}
\end{codeblock}
À noter que, dans un tel cas de figure, il reste toujours possible, bien qu'inutile, de spécifier \val{departement} explicitement.
Cela étant, dans la mesure où il ne peut exister qu'un seul domaine de condition implicite par document source, à supposer que -- toujours dans le cas de notre exemple --, nous soyons amenés à devoir gérer un contenu conditionnel multilingue en plus de ceux liés aux départements et aux illustrations, nous devrons alors \emph{spécifier \val{language} explicitement} comme domaine de condition dans les instructions \envn{conditext} et \cmdn{setcondispace} concernées par la gestion conditionnelle multilingue.
Le domaine de condition \val{language} est un domaine de condition prédéfini fourni avec le \xpack{conditext}. Par défaut, c'est lui est est spécifié comme domaine de condition implicite ; toute définition d'un domaine de condition implicite autre que \val{language} (comme ici avec \val{departement}) revient donc à modifier ce comportement par défaut.
\section{Exemple commenté d'utilisation \no 3 : une mini-gestion conditionnelle}
\subsection{}
Imaginons que nous ayons à rédiger un texte utilisant un certain nombre d'expressions techniques récurrentes, comme \quo{texte conditionnel}, \quo{domaine de condition} etc. Dans ce genre de cas, la solution très souvent adoptée pour faciliter la saisie consiste à créer une commande d'abréviation, telle que par exemple \cmdn{tc} qui, lors de la compilation, permettra d'afficher \quo{texte conditionnel} dans le document généré.
Or, la limite de ces commandes d'abréviation se rencontre dès que l'on est amené à devoir gérer un contenu conditionnel multilingue. Ainsi, en l'état, notre \xcmdn{tc} n'est exploitable que dans un texte en français. À la rigueur, l'on pourrait créer autant de commandes d'abréviation pour une expression donnée qu'il y aurait de langues concernées, mais, dans un long document multilingue et pour un nombre important d'expressions différentes, l'utilisation de ces commandes (sans parler de leur administration en cas de modification) deviendrait très vite aussi fastidieuse que la saisie répétée de l'expression elle-même, qui est pourtant ce que nous souhaitons éviter.
La \xcmdn{miniconditext} permet de remédier à cette limite.
\tutostep
Partons sur l'idée que nous avons pour objectif de générer, à partir d'un seul document source à contenu conditionnel multilingue -- français, anglais, espagnol et italien pour les besoins de notre exemple --, différents documents contenant chacun une des versions linguistiques du texte.
Dans le cas de notre exemple, plutôt qu'une commande définie sous la forme \cmd{NewDocumentCommand}[\cmdn{tc}\argmvoid{}\argm{texte conditionnel}] et déclinée en français, anglais, espagnol et italien, nous allons pouvoir, grâce à la \xcmdn{miniconditext}, inscrire différents \quo{niveaux} linguistiques à l'interne même d'une seule commande d'abréviation. Choisissons \cmdn{tcml} (\cmdnx{ml} pour \quo{multilingue}) comme nom de la commande et définissons-la de la manière suivante :
\begin{codeblock}
\codestm{\cmd{NewDocumentCommand}[\cmdn{tcml}\argmvoid{}]\argmbegin{}}
\begin{subcodeblock}
\codestm{\cmd{miniconditext}[\argm{texte conditionnel}]}
\codestm{\argo{conditional text}}
\codestm{\argovoid{}}
\codestm{\argo{texto condicional}}
\codestm{\argo{testo condizionale}\argmend{}}
\end{subcodeblock}
\end{codeblock}
Précisons avant tout que le code qui précède est supposé placé dans le préambule.
Cela étant, l'on remarquera en premier lieu que l'expression en français est spécifiée en tant qu'argument obligatoire de \cmdn{miniconditext} ; que les expressions en anglais, espagnol et italien sont spécifiées en tant qu'arguments optionnels de \cmdn{miniconditext} ; et qu'un argument vide figure entre l'argument correspondant à l'expression en anglais et l'argument correspondant à l'expression en espagnol.
En fait, nous utilisons ici les modalités par défaut de \cmdn{miniconditext}, destinées à une gestion conditionnelle multilingue (nous verrons plus bas comment l'on peut utiliser \cmdn{miniconditext} dans d'autres contextes).
Chaque argument permet de spécifier une forme substituable dans une langue donnée, sur la base de 9 arguments au total -- tous optionnels sauf le premier --, correspondant respectivement et dans l'ordre, aux langues française, anglaise, allemande, espagnole, italienne, portuguaise, néerlandaise, danoise et norvégienne. Bien que non explicites dans la syntaxe de \cmdn{miniconditext}, l'on doit toujours avoir à l'esprit les correspondances entre les arguments et les langues pour pouvoir dûment spécifier les formes substituables.
L'argument vide qui figure dans le code correspond donc à la langue allemande ; il est laissé vide puisque nous n'avons pas besoin de gérer cette langue (ni les langues portuguaise, néerlandaise etc.) dans le document source. À noter que, de façon générale, tout argument optionnel non renseigné placé entre un ou plusieurs arguments renseignés doit figurer sous la forme \argovoid{}.
\tutostep
Notre \xcmdn{tcml} ainsi définie peut désormais être utilisée à volonté, comme dans le document source ci-après.
Pour constituer ce document source, nous avons utilisé un petit texte sous traductions anglaise, espagnole et italienne fournies par le site \site*{Reverso}, mais il pourrait tout aussi bien s'agir de textes différents d'une langue à l'autre puisque la \xcmdn{tcml} y serait utilisée à l'identique.
\begin{codeblock}
\codestm{\cmd{documentclass}[\argm{article}]}
\codestm{\cmd{usepackage}[\argo{english,spanish,italian,french}\argm{babel}]}
\codestm{\cmd{usepackage}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{NewDocumentCommand}[\cmdn{tcml}\argmvoid{}]\argmbegin{}}
\begin{subcodeblock}
\codestm{\cmd{miniconditext}[\argm{texte conditionnel}]}
\codestm{\argo{conditional text}}
\codestm{\argovoid{}}
\codestm{\argo{texto condicional}}
\codestm{\argo{testo condizionale}\argmend{}}
\end{subcodeblock}
\codestm{}
\codestm{\cmd{setcondispace}[\argm{spanish}]}
\codestm{}
\codestm{\cmd{begin}[\argm{document}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{french}]}
\begin{subcodeblock}
\codestm{Vous pouvez créer un champ \cmd{tcml}[\argmvoid{}] qui affiche le mot "pages" au lieu du mot "page" dès lors que le document comporte plusieurs pages. Pour afficher un \cmd{tcml}[\argmvoid{}] basé sur le nombre de pages...}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{english}]}
\begin{subcodeblock}
\codestm{You can create a \cmd{tcml}[\argmvoid{}] field that displays the word "pages" instead of "page" if your document contains more than one page. To display \cmd{tcml}[\argmvoid{}] based on the number of pages...}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{spanish}]}
\begin{subcodeblock}
\codestm{Puede crear un campo de \cmd{tcml}[\argmvoid{}] que muestre la palabra "páginas" en lugar de "página" si el documento contiene más de una página. Para mostrar un \cmd{tcml}[\argmvoid{}] basado en el número de páginas...}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{begin}[\argm{conditext}\argm{italian}]}
\begin{subcodeblock}
\codestm{È possibile creare un campo \cmd{tcml}[\argmvoid{}] che visualizza la parola "pagine" invece della parola "pagina" se il documento ha più pagine. Per visualizzare un \cmd{tcml}[\argmvoid{}] basato sul numero di pagine...}
\end{subcodeblock}
\codestm{\cmd{end}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{end}[\argm{document}]}
\end{codeblock}
Si nous compilons en l'état, nous obtenons bien un document comportant le texte espagnol, conformément à l'instruction \cmd{setcondispace}[\argm{spanish}] figurant dans le préambule. Toutefois, \quo{texto condicional} ne figure pas pour autant. En fait, il manque l'instruction spécifique permettant d'intégrer l'expression dans le texte.
L'on désigne quelle forme substituable spécifiée dans \cmdn{miniconditext} doit figurer dans le document généré, au moyen de la \xcmdn{setminicondispace}. Ainsi que son nom l'indique, \cmdn{setminicondispace} sert à définir un espace de condition permettant de désigner une forme substituable parmi celles saisies dans \cmdn{miniconditext}.
Dans le cadre de notre exemple, nous devons ajouter, avant ou après \cmd{setcondispace}[\argm{spanish}] mais \emph{après} la définition de la \xcmdn{tcml}, l'instruction suivante :
\begin{codeblock}
\codestm{\cmd{setminicondispace}[\argm{spanish}]}
\end{codeblock}
De la sorte, le document généré correspond désormais à :
\begin{ltext}
\ltextline{Puede crear un campo de texto condicional que muestre la palabra "páginas" en lugar de "página" si el documento contiene más de una página. Para mostrar un texto condicional basado en el número de páginas...}
\end{ltext}
Les instructions \cmdn{setcondispace} et \cmdn{setminicondispace} modifiées de la façon suivante :
\begin{codeblock}
\codestm{\cmd{setcondispace}[\argm{english}]}
\codestm{\cmd{setminicondispace}[\argm{english}]}
\end{codeblock}
permettront à leur tour de générer un document contenant :
\begin{ltext}
\ltextline{You can create a conditional text field that displays the word "pages" instead of "page" if your document contains more than one page. To display conditional text based on the number of pages...}
\end{ltext}
\resumepar Et ainsi de suite.
À noter que, dans une instruction \cmdn{setminicondispace} utilisée pour une gestion conditionnelle multilingue, il faut toujours désigner la forme substituable qui doit figurer dans le document au moyen de l'appellation linguistique propre au \xpack{babel} (ici, respectivement \val{spanish} et \val{english}).
Il n'est pas possible de définir plusieurs \quo{mini-espaces de condition}. Si plusieurs instructions \cmdn{setminicondispace} coexistent dans le préambule, c'est la dernière qui sera prise en compte, avec le risque éventuel d'effets inattendus ou indésirables.
\subsection{}
L'on peut également utiliser \cmdn{miniconditext} dans des contextes de gestion conditionnelle autres qu'une gestion conditionnelle multilingue. Nous allons aborder dans cette dernière partie du tutoriel, la mise en oeuvre d'une mini-gestion conditionnelle spécifique.
Cette mise en oeuvre sera aussi un peu plus complexe que toutes celles que nous avons pu aborder dans les précédents exemples, dans la mesure où elle illustre la manière dont on peut exploiter certains formatages typographiques plus ou moins sophistiqués dans le cadre d'une mini-gestion conditionnelle.
Imaginons que nous ayons à rédiger un rapport d'activité, dont le texte doit pouvoir contenir à divers endroits des commentaires à l'attention de différents services (comptabilité, communication), de manière distincte. En d'autres termes, notre objectif est, à partir d'un même document source, de pouvoir générer trois documents : l'un, qui sera à usage général ; l'autre accompagné de notes à l'attention du service comptabilité (avec usage de la couleur pourpre), le dernier accompagné de notes à l'attention service communication (avec usage de la couleur bleue).
La mini-gestion conditionnelle, avec les commandes qui lui sont propres, est à même de répondre à ce besoin, moyennant certains aménagements.
Ceci implique d'abord de bien comprendre le fonctionnement de la \xcmdn{miniconditext}. Ainsi que nous l'avons vu précédemment, la \xcmdn{miniconditext} possède un argument obligatoire et 8 autres arguments optionnels, chacun de ces arguments servant à spécifier une forme substituable. Il n'y a pas à proprement parler de domaine de condition lorsque l'on utilise la \xcmdn{miniconditext} ; plus exactement, \val{miniconditext} est un domaine de condition en soi.
D'autre part, les propriétés de condition sont invariablement au nombre de 9, à raison d'une par argument, et ont par défaut une sémantique linguistique (respectivement et par ordre d'argument : \val{french}, \val{english}, \val{german}, \val{spanish}, \val{italian}, \val{portuguese}, \val{dutch}, \val{danish} et \val{norsk}).
C'est essentiellement sur les propriétés de condition que doivent porter les modifications, ainsi que nous allons le voir maintenant en détail.
\tutostep
Voici le document source de notre exemple ; pour des raisons de commodité, nous représentons le texte sous la forme de quelques paragraphes en latin simulé :
\begin{codeblock}
\codestm{\cmd{documentclass}[\argm{article}]}
\codestm{\cmd{usepackage}[\argo{french}\argm{babel}]}
\codestm{\cmd{usepackage}[\argm{xcolor}]}
\codestm{\cmd{usepackage}[\argm{soul}]}
\codestm{\cmd{usepackage}[\argm{conditext}]}
\codestm{}
\codestm{\cmd{resettingminicondiprops}}
\codestm{\cmd{setminicondipropi}[\argm{general}]}
\codestm{\cmd{setminicondipropii}[\argm{compta}]}
\codestm{\cmd{setminicondipropiii}[\argm{com}]}
\codestm{}
\codestm{\cmd{NewDocumentCommand}[\cmdn{notecompta}\argm{m O\argm{merci de bien vouloir fournir le graphique correspondant}}]\argmbegin{}}
\begin{subcodeblock}
\codestm{\cmd{miniconditext}[\argm{\#1}]}
\codestm{\argo{\cmd{ul}[\argm{\#1}]\cmd{textcolor}[\argm{purple}\argm{\$\cmd{rightarrow}\$ \cmd{emph}[\argm{\#2}]}]}\argmend{}}
\end{subcodeblock}
\codestm{}
\codestm{\cmd{NewDocumentCommand}[\cmdn{notecom}\argm{m O\argm{merci de bien vouloir fournir un image}}]\argmbegin{}}
\begin{subcodeblock}
\codestm{\cmd{miniconditext}[\argm{\#1}]}
\codestm{\argovoid{}}
\codestm{\argo{\cmd{ul}[\argm{\#1}]\cmd{textcolor}[\argm{blue}\argm{\$\cmd{rightarrow}\$ \cmd{emph}[\argm{\#2}]}]}\argmend{}}
\end{subcodeblock}
\codestm{}
\codestm{\cmd{setminicondispace}[\argm{general}]}
\codestm{}
\codestm{\cmd{begin}[\argm{document}]
\codestm{}
\begin{subcodeblock}
\codestm{\cmd{notecom}[\argm{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque.}]}
\codestm{}
\codestm{Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi auctor lorem non justo. Nam lacus libero, pretium at, lobortis vitae, ultricies et, \cmd{notecompta}[\argm{tellus}]. Donec aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna, vitae ornare odio metus a mi. Morbi ac orci et nisl hendrerit mollis.}
\codestm{}
\codestm{Nulla malesuada porttitor diam. Donec felis erat, congue non, volutpat at, tincidunt tristique, libero. Vivamus viverra \cmd{notecompta}[\argm{vel fermentum felis}\argo{disposez-vous d'un graphique eps concernant cet élément ?}].}
\end{subcodeblock}
\codestm{}
\codestm{\cmd{end}[\argm{document}]}}
\end{codeblock}
(Le \xpack{xcolor} est nécessaire pour attribuer les couleurs mauve et bleue, et le \xpack{soul}, pour souligner certains mots.)
\tutostep
Nous avons d'abord préparé les propriétés de condition correspondant à notre besoin. Dans le cadre d'une mini-gestion conditionnelle, dès lors que l'on souhaite utiliser la \xcmdn{miniconditext} dans un contexte autre que multilingue, il faut redéfinir les propriétés de condition par défaut (de sémantique linguistique). Cette redéfinition se fait au moyen des instructions suivantes :
\begin{codeblock}
\codestm{\cmd{resettingminicondiprops}}
\codestm{\cmd{setminicondipropi}[\argm{general}]}
\codestm{\cmd{setminicondipropii}[\argm{compta}]}
\codestm{\cmd{setminicondipropiii}[\argm{com}]}
\end{codeblock}
Il existe une commande de redéfinition par propriété de condition, soit 9 au total, chacune identifiée par chiffres romains (de \cmdnx{i} à \cmdnx{ix}, donc) : la \xcmdn{setminicondipropi} permet de redéfinir la propriété de condition attachée au premier argument, La \xcmdn{setminicondipropii} permet de redéfinir la propriété de condition attachée au deuxième argument, etc.
Dans le cadre de notre exemple, seules, les trois premières propriétés de condition doivent être redéfinies -- une pour chaque service concerné -- en fonction desquelles seront générées les différentes versions du document
La forme des noms \val{general}, \val{compta} et \val{com} n'est peut-être pas la plus judicieuse possible mais elle suffit pour notre exemple. De manière générale, le choix d'un intitulé de propriété de condition est laissé à l'appréciation de l'utilisateur, avec cela que l'on ne peut utiliser que des caractères alphabétiques, avec ou sans majuscules, sans espace, sans caractères accentués ou à diacritiques.
Quel que soit le nombre de propriétés de condition à redéfinir, Il faut toujours impérativement \emph{commencer par l'instruction} \cmdn{resettingminicondiprops}, qui réinitialise les 9 propriétés de condition avant leur redéfinition. À noter que, dans la présente version du \pack{conditext}, la \xcmdn{miniconditext} ne peut être utilisée qu'avec un seul jeu de propriétés de condition par document source.
Le premier argument de la commande \cmdn{miniconditext} auquel est associée la propriété de condition \val{general} sera une valeur par défaut, non directement exploitée ; nous aurions pu ici ne redéfinir que les première et deuxième propriétés de condition (l'une \val{compta} et l'autre \val{com}) mais l'existence d'une propriété de condition ayant une valeur par défaut, rend le code plus lisible, et permet en outre l'usage -- certes non essentiel -- d'un espace de condition par défaut.
\tutostep
Nous avons défini ensuite deux commandes similaires, nommées respectivement \cmdn{notecompta} et \cmdn{notecom}, chacune intégrant une instruction \cmdn{miniconditext}.
Le principe de fonctionnalité est le même dans les deux cas : il s'agit de pouvoir mettre en relief des mots, des groupes de mots, voire des paragraphes dans le document généré en les accompagnant de commentaires à l'attention du service comptabilité ou du service communication selon les cas. À noter que ces commandes n'ont d'autre prétention que celle d'illustrer un usage de \cmdn{miniconditext}) et ne présentent aucune subtilité de conception particulière.
Nous déclarons chacune des commandes avec 2 arguments, l'un obligatoire (représenté dans le code par \val{m} et \val{\#1}) correspondant à la forme substituable à mettre en relief, et l'autre facultatif avec valeur par défaut (représenté dans le code par \val{O} et \val{\#2}) correspondant au commentaire accompagnant la forme substituable mise en relief. Pour les besoins de notre exemple, si l'argument facultatif de la \xcmdn{notecompta} n'est pas renseigné, le commentaire \quo{merci de bien vouloir fournir le graphique correspondant} figurera par défaut ; de même, en ce qui concerne l'argument facultatif de la \xcmdn{notecom}, le commentaire par défaut sera \quo{merci de bien vouloir fournir un image}.
Dans l'une et l'autre commande, le premier argument de \cmdn{miniconditext}, auquel est associée la propriété de condition \val{general}, sert de valeur par défaut.
La \xcmdn{notecompta} utilise le deuxième argument de \cmdn{miniconditext}, auquel est associée la propriété de condition \val{compta}. Le code placé dans cet argument est intégralement consacré au formatage de la forme substituable qui doit être mise en relief (\val{\#1}) et au formatage du commentaire (\val{\#2}). La forme substituable sera soulignée (instruction \cmdn{ul} propre au \xpack{soul}), et sera suivie, précédée d'une flèche, d'un commentaire en italiques (instruction \cmdn{emph}) et en mauve (instruction \cmdn{xcolor}).
La \xcmdn{notecom} utilise le troisième argument de de \cmdn{miniconditext}, auquel est associée la propriété de condition \val{com}. Le code placé dans cet argument est le même que celui de \cmdn{notecompta}, avec le bleu à la place du mauve pour le texte du commentaire.
Dans le texte de notre exemple, nous avons placé une instruction \cmdn{notecom} intégrant le premier paragraphe dans son ensemble, sans commentaire explicite (c'est la formule par défaut qui figurera dans le document généré à l'attention du service communication). Le deuxième paragraphe contient une instruction \cmdn{notecompta}, intégrant un seul mot, sans commentaire explicite (c'est donc, comme dans le cas précédent, la formule par défaut qui figurera dans le document généré, à l'attention du service comptabilité). Dans le troisième et dernier paragraphe, est placée une instruction \cmdn{notecompta}, intégrant plusieurs mots et cette fois, avec un commentaire personnalisé.
\tutostep
Si, maintenant, nous compilons le document source sans instruction \cmdn{setminiconditext}, ou comme ici avec l'instruction \cmd{setminicondispace}[\argm{general}], nous obtenons le document suivant, dans sa version à usage général comme attendu :
\begin{ltext}
\ltextline{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque.}
\ltextline{Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi auctor lorem non justo. Nam lacus libero, pretium at, lobortis vitae, ultricies et, tellus. Donec aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna, vitae ornare odio metus a mi. Morbi ac orci et nisl hendrerit mollis.}
\ltextline{Nulla malesuada porttitor diam. Donec felis erat, congue non, volutpat at, tincidunt tristique, libero. Vivamus viverra vel fermentum felis.}
\end{ltext}
\resumepar Avec l'instruction \cmd{setminicondispace}[\argm{compta}], le document généré sera :
\begin{ltext}
\ltextline{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque.}
\ltextline{Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi auctor lorem non justo. Nam lacus libero, pretium at, lobortis vitae, ultricies et, \ul{tellus} \textcolor{purple}{$\rightarrow$ \emph{merci de bien vouloir fournir le graphique correspondant}}. Donec aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna, vitae ornare odio metus a mi. Morbi ac orci et nisl hendrerit mollis.}
\ltextline{Nulla malesuada porttitor diam. Donec felis erat, congue non, volutpat at, tincidunt tristique, libero. Vivamus viverra \ul{vel fermentum felis} \textcolor{purple}{$\rightarrow$ \emph{disposez-vous d'un graphique eps concernant cet élément ?}}.}
\end{ltext}
\resumepar et avec l'instruction \cmd{setminicondispace}[\argm{com}] :
\begin{ltext}
\ltextline{\ul{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque} \textcolor{blue}{$\rightarrow$ \emph{merci de bien vouloir fournir un image}}.}
\ltextline{Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi auctor lorem non justo. Nam lacus libero, pretium at, lobortis vitae, ultricies et, tellus. Donec aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna, vitae ornare odio metus a mi. Morbi ac orci et nisl hendrerit mollis.}
\ltextline{Nulla malesuada porttitor diam. Donec felis erat, congue non, volutpat at, tincidunt tristique, libero. Vivamus viverra vel fermentum felis.}
\end{ltext}
Vous voici arrivés à la fin de ce tutoriel. Son auteur espère qu'il vous aura permis de vous familiariser agréablement avec le \xpack{conditext}, ses différentes commandes et ses possibilités. Dans ce domaine comme dans d'autres, rien ne vaut la pratique. Vous pourrez à loisir consulter la partie \titref{CtDoc_Commandes} de cette documentation pour obtenir la description détaillée d'une commande, certaines précisions d'utilisation etc.
Que ce paquet puisse vous faciliter la tâche relativement à la gestion de contenus conditionnels sous \Latex, voilà le simple mais sincère souhait de son auteur.
\end{document}
|