Probleem minu arusaamisega laiendamisest ja uus käsk argumentidest ja lõuna
Problem With My Understanding Expandafter
Lahendus:
Peaksite olema teadlik tõsiasjast, et Kat vajab salvestatud teksti edastamiseks rohkem kui ühte laiendamisetappi: pärast esimest laiendamisetappi
expandafter csname INT rom {1} intKATAkatNUM rom {1} number endcsnameSee expandafter ei tee üldse midagi, sest üritab laienedaI.
Saate sundida peaaegu täielikku laiendamist, mida siin vajate, kasutades ' romannumeral trikk:
documentclass {article} usepackage {ulem, lipsum} usepackage [T1] {fontenc} newcommand*{ rom} [1] { romannumeral #1} newcommand INTiintKATAkatNUMinum {% testtekst tutvustamiseks. Originaalis on see käsk konstrueeritud. %} newcommand { Kat} [4] {% Käsk koostatud käskude kokkupanemiseks. csname INT rom {#1} intKAT#2katNUM rom {#3} num#4 endcsname} newcommand soutt [1] {% sout koos laiendusega expandafter sout expandafter { romannumeral-`Q#1 } %} begin {document} parbox {2cm} { sout {Ulemi lõunapoolne makro suudab hakkama saada sidekriipsude ja reavahetustega otse sisestatud tekstis, kuid mitte makrona, vaata järgmist rida!} soutt { INTiintKATAkatNUMinum} % töötab soutt { Kat {1} {A} {1} {}} %ei} lõpp {dokument} 
Ja ei, sout ei tee sidekriipsu.
The Romannumeral trikki on mitu korda selgitatud, kuid siin on lühike illustratsioon.
Primitiivne Romannumeral tahab apärast seda ja siin kasutame TeX -i omapärast omadust: pärast selgesõnalist, TeX otsibpärast seda märke laiendades selle otsingu ajal; see peatab laiendamise, kui on leitud kas selgesõnaline tühimärk või laiendamatu märk.
Selgesõnalinesaab väljendada mitmel viisil:
- numbrite jada;
- kuueteistkümnendarv, see tähendab numbrite või märkide jada
ABCDEF, kui esimene märk on';
- kaheksandarv, see tähendab numbrite jada nende vahel
01234567, kui esimene märk on';
- tähestikuline konstant, kui esimene märk on
`(tagatsitaat).
Kõikidel juhtudel peaks radiksi märgistusele eelnema miinusmärk'' ', kui tahame määrata negatiivse arvu.
Esimesel kolmel juhul teostab TeX laienemist, kuni leiab midagi, mis ei vasta vastuvõetavale numbrile.
Juhtum, mis meid huvitab, on viimane. Tähestikuline konstant on tähemärk või juhtjärjestus, mille nimi koosneb ühest tähemärgist (ja seda ei pea määratlema). Niisiis
'Q' Qon samaväärsed viisid numbri 81 küsimiseks (ASCII kood Q). Põgenenud märge on hädavajalik kummalise kategooriakoodiga märkide jaoks, näiteks
`\%` ^^ @(viimane on 0).
Asjaolu, et TeX laiendab tähti pärast tähestikulisi konstande, on selle rakenduse jaoks määrav:on juba täielikult teada ja meie puhul on see nii-81, kuid TeX laiendab märke sellegipoolest. Pärast valikulise ruumi otsimise lõpetamist jätkab TeX selle laiendamise lõpuleviimist romannumeral-`Q, mis on tühi, kuna arv on negatiivne.
Me ei saa kasutada romannumeral-81 otse, sest kui järgmine märk pärast laiendamist juhtub olema number, võetakse see osana.
Selle meetodi piirang on see, et lõpliku laienduse esialgne ruum tühjendatakse.
TeX Live'i järgmises väljaandes on kõigil mootoritel laiendatud (praegu saadaval ainult LuaTeX -iga); MiKTeX -põhistel mootoritel peaks see juba olemas olema. Koos laiendatud, on asi lihtsam:
newcommand soutt [1] {% sout koos laiendusega expandafter sout expandafter { laiendatud {#1}}}sest expand laiendab oma argumendi ühe sammuga täielikult.
Sa võid kasutadahing, kui tahad sidekriipsu. Vastav makro on st (või textt). Lihtsalt vahelduseks võtan selle kasutuseleExpl3, kus Romannumeral on saadaval kuif-laienemine.
documentclass {article} usepackage [T1] {fontenc} usepackage {soul} usepackage {xparse} ExplSyntaxOn NewDocumentCommand { Kat} {mmmm} { use: c {INT int_to_roman: n {#1} intKAT #2 katNUM int_to_roman: n { #3} num #4}} NewExpandableDocumentCommand { soutt} {m} { oberreiter_sout: f { #1}} cs_new_protected: Nn oberreiter_sout: n { textt { #1} } cs_generate_variant: Nn oberreiter_sout: n {f} ExplSyntaxOff newcommand INTiintKATAkatNUMinum {% Testtekst tutvustamiseks. Originaalis on see käsk konstrueeritud. %} begin {document} parbox {2cm} { st {Hinge esimene makro suudab hakkama saada sidekriipsude ja reavahetustega otse sisestatud tekstis, kuid mitte makrona, vaata järgmist rida!} soutt { INTiintKATAkatNUMinum} % töötab soutt { Kat {1} {A} {1} {}} %ei} lõpp {document} 