Extract more than nine arguments that occur periodically in a sentence to use in macros in order to typset
What is a good way to write a definition of the type fun below
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
where the number of arguments is not known in advance, may be 1, or may be more than 9, like 12, and the result is as below
abc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
Assume for answers
form
is same type asnewcommand{form}[1]{emph{#1}}
. But delay expansion until the end. Just in case.
Probably requires several nested def
cases taking two variables each and a if
to decide when to halt the loop ... like when allowing more than 9 arguments to a macro? Or use etoolbox for something better?
If separator words efg jkl are not the same from one place to the next, certain they they are of some specific length, assume efg jkl <=> always 9 characters separating one input from the next. While abc EDF xyz are of different lengths possibly, but always three separate words.
CLARIFICATION: The
xyz
can be arbitrary. But the sentence is periodic in that the 3rd, 8th, 13th, 18th word isform
wrapped. If it exists. At least 3 words exists. But can be 3, and if not 3 then 8, and if not 8 then 13, as long as needed, ends when no separator behind three words which can all differ ... The separator " efg jkl " does repeat with certainty however and can be caught to parse.
macros tex-core parsing
add a comment |
What is a good way to write a definition of the type fun below
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
where the number of arguments is not known in advance, may be 1, or may be more than 9, like 12, and the result is as below
abc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
Assume for answers
form
is same type asnewcommand{form}[1]{emph{#1}}
. But delay expansion until the end. Just in case.
Probably requires several nested def
cases taking two variables each and a if
to decide when to halt the loop ... like when allowing more than 9 arguments to a macro? Or use etoolbox for something better?
If separator words efg jkl are not the same from one place to the next, certain they they are of some specific length, assume efg jkl <=> always 9 characters separating one input from the next. While abc EDF xyz are of different lengths possibly, but always three separate words.
CLARIFICATION: The
xyz
can be arbitrary. But the sentence is periodic in that the 3rd, 8th, 13th, 18th word isform
wrapped. If it exists. At least 3 words exists. But can be 3, and if not 3 then 8, and if not 8 then 13, as long as needed, ends when no separator behind three words which can all differ ... The separator " efg jkl " does repeat with certainty however and can be caught to parse.
macros tex-core parsing
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4}
andfun{abc1 EDF1 xyz1}
andfun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ... efg jkl abc12 EDF12 xyz12}
, etc, equally possible. Some kind of loop required. But note that there would not appear any numbers in the input phrase; the numbers are here to illustrate how long happens to be the list. Just the list is always entered as a specific kind of sentence.
– Guido Jorg
2 days ago
Splitting such an input at spaces is easy, and testing for some regular expression too (with expl3) but your description is a bit confusing.
– Ulrike Fischer
2 days ago
Without knowing the rules for applyingform
it's really difficult to answer.
– egreg
2 days ago
@GuidoJorg I'm not asking whatform
should do, but to which parts it should be applied. Some real world examples might help to understand. As the question stands, it's impossible to guess.
– egreg
2 days ago
@egreg to the 3rd, 8th, 13th, 18th ... word in the sentence. Separator can be assumed to repeat. form affects only these parts. And sentence can be arbitrarily long and will end without the separator.
– Guido Jorg
2 days ago
add a comment |
What is a good way to write a definition of the type fun below
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
where the number of arguments is not known in advance, may be 1, or may be more than 9, like 12, and the result is as below
abc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
Assume for answers
form
is same type asnewcommand{form}[1]{emph{#1}}
. But delay expansion until the end. Just in case.
Probably requires several nested def
cases taking two variables each and a if
to decide when to halt the loop ... like when allowing more than 9 arguments to a macro? Or use etoolbox for something better?
If separator words efg jkl are not the same from one place to the next, certain they they are of some specific length, assume efg jkl <=> always 9 characters separating one input from the next. While abc EDF xyz are of different lengths possibly, but always three separate words.
CLARIFICATION: The
xyz
can be arbitrary. But the sentence is periodic in that the 3rd, 8th, 13th, 18th word isform
wrapped. If it exists. At least 3 words exists. But can be 3, and if not 3 then 8, and if not 8 then 13, as long as needed, ends when no separator behind three words which can all differ ... The separator " efg jkl " does repeat with certainty however and can be caught to parse.
macros tex-core parsing
What is a good way to write a definition of the type fun below
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
where the number of arguments is not known in advance, may be 1, or may be more than 9, like 12, and the result is as below
abc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
Assume for answers
form
is same type asnewcommand{form}[1]{emph{#1}}
. But delay expansion until the end. Just in case.
Probably requires several nested def
cases taking two variables each and a if
to decide when to halt the loop ... like when allowing more than 9 arguments to a macro? Or use etoolbox for something better?
If separator words efg jkl are not the same from one place to the next, certain they they are of some specific length, assume efg jkl <=> always 9 characters separating one input from the next. While abc EDF xyz are of different lengths possibly, but always three separate words.
CLARIFICATION: The
xyz
can be arbitrary. But the sentence is periodic in that the 3rd, 8th, 13th, 18th word isform
wrapped. If it exists. At least 3 words exists. But can be 3, and if not 3 then 8, and if not 8 then 13, as long as needed, ends when no separator behind three words which can all differ ... The separator " efg jkl " does repeat with certainty however and can be caught to parse.
macros tex-core parsing
macros tex-core parsing
edited yesterday
Guido Jorg
asked 2 days ago
Guido JorgGuido Jorg
1,15631344
1,15631344
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4}
andfun{abc1 EDF1 xyz1}
andfun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ... efg jkl abc12 EDF12 xyz12}
, etc, equally possible. Some kind of loop required. But note that there would not appear any numbers in the input phrase; the numbers are here to illustrate how long happens to be the list. Just the list is always entered as a specific kind of sentence.
– Guido Jorg
2 days ago
Splitting such an input at spaces is easy, and testing for some regular expression too (with expl3) but your description is a bit confusing.
– Ulrike Fischer
2 days ago
Without knowing the rules for applyingform
it's really difficult to answer.
– egreg
2 days ago
@GuidoJorg I'm not asking whatform
should do, but to which parts it should be applied. Some real world examples might help to understand. As the question stands, it's impossible to guess.
– egreg
2 days ago
@egreg to the 3rd, 8th, 13th, 18th ... word in the sentence. Separator can be assumed to repeat. form affects only these parts. And sentence can be arbitrarily long and will end without the separator.
– Guido Jorg
2 days ago
add a comment |
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4}
andfun{abc1 EDF1 xyz1}
andfun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ... efg jkl abc12 EDF12 xyz12}
, etc, equally possible. Some kind of loop required. But note that there would not appear any numbers in the input phrase; the numbers are here to illustrate how long happens to be the list. Just the list is always entered as a specific kind of sentence.
– Guido Jorg
2 days ago
Splitting such an input at spaces is easy, and testing for some regular expression too (with expl3) but your description is a bit confusing.
– Ulrike Fischer
2 days ago
Without knowing the rules for applyingform
it's really difficult to answer.
– egreg
2 days ago
@GuidoJorg I'm not asking whatform
should do, but to which parts it should be applied. Some real world examples might help to understand. As the question stands, it's impossible to guess.
– egreg
2 days ago
@egreg to the 3rd, 8th, 13th, 18th ... word in the sentence. Separator can be assumed to repeat. form affects only these parts. And sentence can be arbitrarily long and will end without the separator.
– Guido Jorg
2 days ago
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4}
and fun{abc1 EDF1 xyz1}
and fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ... efg jkl abc12 EDF12 xyz12}
, etc, equally possible. Some kind of loop required. But note that there would not appear any numbers in the input phrase; the numbers are here to illustrate how long happens to be the list. Just the list is always entered as a specific kind of sentence.– Guido Jorg
2 days ago
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4}
and fun{abc1 EDF1 xyz1}
and fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ... efg jkl abc12 EDF12 xyz12}
, etc, equally possible. Some kind of loop required. But note that there would not appear any numbers in the input phrase; the numbers are here to illustrate how long happens to be the list. Just the list is always entered as a specific kind of sentence.– Guido Jorg
2 days ago
Splitting such an input at spaces is easy, and testing for some regular expression too (with expl3) but your description is a bit confusing.
– Ulrike Fischer
2 days ago
Splitting such an input at spaces is easy, and testing for some regular expression too (with expl3) but your description is a bit confusing.
– Ulrike Fischer
2 days ago
Without knowing the rules for applying
form
it's really difficult to answer.– egreg
2 days ago
Without knowing the rules for applying
form
it's really difficult to answer.– egreg
2 days ago
@GuidoJorg I'm not asking what
form
should do, but to which parts it should be applied. Some real world examples might help to understand. As the question stands, it's impossible to guess.– egreg
2 days ago
@GuidoJorg I'm not asking what
form
should do, but to which parts it should be applied. Some real world examples might help to understand. As the question stands, it's impossible to guess.– egreg
2 days ago
@egreg to the 3rd, 8th, 13th, 18th ... word in the sentence. Separator can be assumed to repeat. form affects only these parts. And sentence can be arbitrarily long and will end without the separator.
– Guido Jorg
2 days ago
@egreg to the 3rd, 8th, 13th, 18th ... word in the sentence. Separator can be assumed to repeat. form affects only these parts. And sentence can be arbitrarily long and will end without the separator.
– Guido Jorg
2 days ago
add a comment |
3 Answers
3
active
oldest
votes
documentclass{article}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{fun}{m}
{
% split the input at the spaces
seq_set_split:Nnn l_tmpa_seq { ~ } { #1 }
% use a counter for knowing where we are
int_zero:N l_tmpa_int
% map the sequence
seq_map_inline:Nn l_tmpa_seq
{% one more step
int_incr:N l_tmpa_int
int_compare:nTF { int_mod:nn { l_tmpa_int - 3 } { 5 } = 0 }
{% if we're at the 3rd, 5th, 8th, 13th, ... item, apply form
form { ##1 }
}
{% otherwise just deliver the item
##1
}
% if not at the last, add a space
int_compare:nT { l_tmpa_int < seq_count:N l_tmpa_seq } { ~ }
}
}
ExplSyntaxOff
NewDocumentCommand{form}{m}{emph{#1}}
begin{document}
raggedright
fun{Non eram nescius Brute cum quae summis ingeniis exquisitaque
doctrina philosophi Graeco sermone tractavissent ea Latinis
litteris mandaremus fore ut hic noster labor in varias
reprehensiones incurreret Nam quibusdam et iis quidem non
admodum indoctis totum hoc displicet philosophari Quidam
autem non tam id reprehendunt si remissius agatur sed tantum
studium tamque multam operam ponendam in eo non arbitrantur
Erunt etiam et ii quidem eruditi Graecis litteris contemnentes
Latinas qui se dicant in Graecis legendis operam malle consumere
Postremo aliquos futuros suspicor qui me ad alias litteras
vocent genus hoc scribendi etsi sit elegans personae tamen
et dignitatis esse negent}
end{document}
@GuidoJorg That's very vague.
– egreg
yesterday
@GuidoJorg That makes things even more obscure.
– egreg
yesterday
Simplest example:fun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}' displays
Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco` not the result offun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
. Due to extra{}
. What should be done sofun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
displays whenfun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}
is entered?
– Guido Jorg
yesterday
@GuidoJorg Why shouldfun{{...}}
give the same result asfun{...}
? I see no reason to.
– egreg
yesterday
By itself: A displays as {A}. In the use case, composition is desirable. If the text intofun
is generated by some macro, not directly entered,fun
won't process it. Because it seems the result is treated as {A} rather than A. Even though it is A. Single object. fun sees no separators when Ab Cd Ef = macro{test} and fun{macro{test}}.
– Guido Jorg
yesterday
|
show 2 more comments
(updated this answer signficantly to allow for multiple (expandable) macros in the argument of fun
.)
Here's a LuaLaTeX-based solution. It can handle multiple, expandable macros in the argument of fun
. The Lua code first splits the (expanded) input string into separate words, taking note of punctuation characters, if present. It then proceeds to print them, encasing the 3rd, 8th, 13th, 18th words in the form
macro. (Mathematically speaking, the selection criterion is that the word's position in the table, modulo 4, equals 3.) Non-ASCII UTF8-encoded characters are fine (because the unicode.utf8.gmatch
function rather than the "basic" string.gmatch
function is employed.)
% !TEX TS-program = lualatex
documentclass{article}
usepackage{luacode} % for 'luacode' environment and 'luastring' macro
%% Lua-side code
begin{luacode}
function do_fun ( s )
words = {} -- initialize a Lua table
-- split 's' into constituent words
for word in unicode.utf8.gmatch ( s , "%w+%p?" ) do
table.insert ( words , word )
end
-- apply "form" macro at 3rd, 8th, 13th, etc words
for i = 1 , #words do
if i%5 == 3 then
tex.sprint ( "\form{"..words[i].."} " )
else
tex.sprint ( words[i].." " )
end
end
end
end{luacode}
%% TeX-side code
newcommandfun[1]{directlua{do_fun(luastring{#1})}}
newcommandform[1]{emph{#1}}
newcommandblurbA{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris.}
newcommandblurbB{Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant.}
newcommandblurbC{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF4 xyz4 efg jkl abc5 EDF5 xyz5 efg jkl abc6 EDF6 xyz6 efg jkl abc7 EDF7 xyz7 efg jkl abc8 EDF8 xyz8 efg jkl abc9 EDF9 xyz9 efg jkl abc10 EDF10 xyz10 efg jkl abc11 EDF11 xyz11 efg jkl abc12 EDF12 xyz12 efg jkl abc13 EDF13 xyz13}
begin{document}
raggedright
fun{blurbAblurbBblurbC}
end{document}
Probably cannot use for a journal but LuaLaTex solutions are very elegant. I will look at LuaTex some more for personal use, have not used it much before.
– Guido Jorg
yesterday
1
@GuidoJorg - Some, but certainly not all, journals by now allow LuaLaTeX in addition to pdfLaTeX.
– Mico
yesterday
add a comment |
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcounter{formtrigger}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{ }%
readlist*funlist{#1}%
setcounter{formtrigger}{2}%
foreachitemxinfunlist{%
stepcounter{formtrigger}%
ifnumtheformtrigger=5relax
form{x}setcounter{formtrigger}{0}%
else%
x%
fi%
%
}
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
end{document}
ORIGINAL ANSWER
The listofitems
package can grab these inputs very easily, preserving the original tokens without expansion.
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{ }%
readlistfunlist{#1}%
foreachitemxinfunlist{%
Argument xcnt{} istabto{1.3in}``detokenizeexpandafter{x}'':
tabto{2.5in}xpar
}%
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3
efg jkl abc4 EDF2 xyz4 ... abc1 EDF1 form{xyz1} efg jkl abc2
EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4
EDF2 form{xyz4} ...}
end{document}
If you need multi-layer parsing, say that efg jkl
is the trigger to separate larger subgroups of arguments, then we have the following (note: efg jkl
is not considered an argument, but an argument separator):
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{efg jkl/ }%
readlist*funlist{#1}%
foreachitemxinfunlist{%
foreachitemyinfunlist[xcnt]{%
Group xcnt{} sub-argument ycnt{} istabto{2in}``detokenize
expandafterexpandafterexpandafter{funlist[xcnt,ycnt]}'':
tabto{3.2in}funlist[xcnt,ycnt]par
}}%
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3
efg jkl abc4 EDF2 xyz4 ... abc1 EDF1 form{xyz1} efg jkl abc2
EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4
EDF2 form{xyz4} ...}
end{document}
Can you say how to get a sentence in one line to occur, rather than a list? Of the rightmost list in the image? (Also for learning how to write such macros, how does listofitems pull this off, can you suggest? I assume it checks ifx style whether the argument separator occurs or not to decide to loop and relies on a def that that takes one argument and has two cases ... Or calls a package with check for ifempty?)
– Guido Jorg
2 days ago
@GuidoJorg To learn about the package: ctan.org/pkg/listofitems
– Steven B. Segletes
2 days ago
@GuidoJorg As to your request, to make a sentence of the right hand column is not really to parse the list at all, but just to typeset the argument. So could you clarify what you are asking?
– Steven B. Segletes
2 days ago
The result looking for is what would be printed hadabc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
been entered manually. When in factfun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
was entered manually. Though the knowledge of how to parse the list completely is useful to know, as is the package, didn't know about it :)
– Guido Jorg
2 days ago
1
@GuidoJorg Please see my revision.
– Steven B. Segletes
yesterday
|
show 3 more comments
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "85"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f480991%2fextract-more-than-nine-arguments-that-occur-periodically-in-a-sentence-to-use-in%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
documentclass{article}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{fun}{m}
{
% split the input at the spaces
seq_set_split:Nnn l_tmpa_seq { ~ } { #1 }
% use a counter for knowing where we are
int_zero:N l_tmpa_int
% map the sequence
seq_map_inline:Nn l_tmpa_seq
{% one more step
int_incr:N l_tmpa_int
int_compare:nTF { int_mod:nn { l_tmpa_int - 3 } { 5 } = 0 }
{% if we're at the 3rd, 5th, 8th, 13th, ... item, apply form
form { ##1 }
}
{% otherwise just deliver the item
##1
}
% if not at the last, add a space
int_compare:nT { l_tmpa_int < seq_count:N l_tmpa_seq } { ~ }
}
}
ExplSyntaxOff
NewDocumentCommand{form}{m}{emph{#1}}
begin{document}
raggedright
fun{Non eram nescius Brute cum quae summis ingeniis exquisitaque
doctrina philosophi Graeco sermone tractavissent ea Latinis
litteris mandaremus fore ut hic noster labor in varias
reprehensiones incurreret Nam quibusdam et iis quidem non
admodum indoctis totum hoc displicet philosophari Quidam
autem non tam id reprehendunt si remissius agatur sed tantum
studium tamque multam operam ponendam in eo non arbitrantur
Erunt etiam et ii quidem eruditi Graecis litteris contemnentes
Latinas qui se dicant in Graecis legendis operam malle consumere
Postremo aliquos futuros suspicor qui me ad alias litteras
vocent genus hoc scribendi etsi sit elegans personae tamen
et dignitatis esse negent}
end{document}
@GuidoJorg That's very vague.
– egreg
yesterday
@GuidoJorg That makes things even more obscure.
– egreg
yesterday
Simplest example:fun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}' displays
Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco` not the result offun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
. Due to extra{}
. What should be done sofun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
displays whenfun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}
is entered?
– Guido Jorg
yesterday
@GuidoJorg Why shouldfun{{...}}
give the same result asfun{...}
? I see no reason to.
– egreg
yesterday
By itself: A displays as {A}. In the use case, composition is desirable. If the text intofun
is generated by some macro, not directly entered,fun
won't process it. Because it seems the result is treated as {A} rather than A. Even though it is A. Single object. fun sees no separators when Ab Cd Ef = macro{test} and fun{macro{test}}.
– Guido Jorg
yesterday
|
show 2 more comments
documentclass{article}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{fun}{m}
{
% split the input at the spaces
seq_set_split:Nnn l_tmpa_seq { ~ } { #1 }
% use a counter for knowing where we are
int_zero:N l_tmpa_int
% map the sequence
seq_map_inline:Nn l_tmpa_seq
{% one more step
int_incr:N l_tmpa_int
int_compare:nTF { int_mod:nn { l_tmpa_int - 3 } { 5 } = 0 }
{% if we're at the 3rd, 5th, 8th, 13th, ... item, apply form
form { ##1 }
}
{% otherwise just deliver the item
##1
}
% if not at the last, add a space
int_compare:nT { l_tmpa_int < seq_count:N l_tmpa_seq } { ~ }
}
}
ExplSyntaxOff
NewDocumentCommand{form}{m}{emph{#1}}
begin{document}
raggedright
fun{Non eram nescius Brute cum quae summis ingeniis exquisitaque
doctrina philosophi Graeco sermone tractavissent ea Latinis
litteris mandaremus fore ut hic noster labor in varias
reprehensiones incurreret Nam quibusdam et iis quidem non
admodum indoctis totum hoc displicet philosophari Quidam
autem non tam id reprehendunt si remissius agatur sed tantum
studium tamque multam operam ponendam in eo non arbitrantur
Erunt etiam et ii quidem eruditi Graecis litteris contemnentes
Latinas qui se dicant in Graecis legendis operam malle consumere
Postremo aliquos futuros suspicor qui me ad alias litteras
vocent genus hoc scribendi etsi sit elegans personae tamen
et dignitatis esse negent}
end{document}
@GuidoJorg That's very vague.
– egreg
yesterday
@GuidoJorg That makes things even more obscure.
– egreg
yesterday
Simplest example:fun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}' displays
Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco` not the result offun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
. Due to extra{}
. What should be done sofun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
displays whenfun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}
is entered?
– Guido Jorg
yesterday
@GuidoJorg Why shouldfun{{...}}
give the same result asfun{...}
? I see no reason to.
– egreg
yesterday
By itself: A displays as {A}. In the use case, composition is desirable. If the text intofun
is generated by some macro, not directly entered,fun
won't process it. Because it seems the result is treated as {A} rather than A. Even though it is A. Single object. fun sees no separators when Ab Cd Ef = macro{test} and fun{macro{test}}.
– Guido Jorg
yesterday
|
show 2 more comments
documentclass{article}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{fun}{m}
{
% split the input at the spaces
seq_set_split:Nnn l_tmpa_seq { ~ } { #1 }
% use a counter for knowing where we are
int_zero:N l_tmpa_int
% map the sequence
seq_map_inline:Nn l_tmpa_seq
{% one more step
int_incr:N l_tmpa_int
int_compare:nTF { int_mod:nn { l_tmpa_int - 3 } { 5 } = 0 }
{% if we're at the 3rd, 5th, 8th, 13th, ... item, apply form
form { ##1 }
}
{% otherwise just deliver the item
##1
}
% if not at the last, add a space
int_compare:nT { l_tmpa_int < seq_count:N l_tmpa_seq } { ~ }
}
}
ExplSyntaxOff
NewDocumentCommand{form}{m}{emph{#1}}
begin{document}
raggedright
fun{Non eram nescius Brute cum quae summis ingeniis exquisitaque
doctrina philosophi Graeco sermone tractavissent ea Latinis
litteris mandaremus fore ut hic noster labor in varias
reprehensiones incurreret Nam quibusdam et iis quidem non
admodum indoctis totum hoc displicet philosophari Quidam
autem non tam id reprehendunt si remissius agatur sed tantum
studium tamque multam operam ponendam in eo non arbitrantur
Erunt etiam et ii quidem eruditi Graecis litteris contemnentes
Latinas qui se dicant in Graecis legendis operam malle consumere
Postremo aliquos futuros suspicor qui me ad alias litteras
vocent genus hoc scribendi etsi sit elegans personae tamen
et dignitatis esse negent}
end{document}
documentclass{article}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{fun}{m}
{
% split the input at the spaces
seq_set_split:Nnn l_tmpa_seq { ~ } { #1 }
% use a counter for knowing where we are
int_zero:N l_tmpa_int
% map the sequence
seq_map_inline:Nn l_tmpa_seq
{% one more step
int_incr:N l_tmpa_int
int_compare:nTF { int_mod:nn { l_tmpa_int - 3 } { 5 } = 0 }
{% if we're at the 3rd, 5th, 8th, 13th, ... item, apply form
form { ##1 }
}
{% otherwise just deliver the item
##1
}
% if not at the last, add a space
int_compare:nT { l_tmpa_int < seq_count:N l_tmpa_seq } { ~ }
}
}
ExplSyntaxOff
NewDocumentCommand{form}{m}{emph{#1}}
begin{document}
raggedright
fun{Non eram nescius Brute cum quae summis ingeniis exquisitaque
doctrina philosophi Graeco sermone tractavissent ea Latinis
litteris mandaremus fore ut hic noster labor in varias
reprehensiones incurreret Nam quibusdam et iis quidem non
admodum indoctis totum hoc displicet philosophari Quidam
autem non tam id reprehendunt si remissius agatur sed tantum
studium tamque multam operam ponendam in eo non arbitrantur
Erunt etiam et ii quidem eruditi Graecis litteris contemnentes
Latinas qui se dicant in Graecis legendis operam malle consumere
Postremo aliquos futuros suspicor qui me ad alias litteras
vocent genus hoc scribendi etsi sit elegans personae tamen
et dignitatis esse negent}
end{document}
answered yesterday
egregegreg
728k8819263235
728k8819263235
@GuidoJorg That's very vague.
– egreg
yesterday
@GuidoJorg That makes things even more obscure.
– egreg
yesterday
Simplest example:fun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}' displays
Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco` not the result offun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
. Due to extra{}
. What should be done sofun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
displays whenfun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}
is entered?
– Guido Jorg
yesterday
@GuidoJorg Why shouldfun{{...}}
give the same result asfun{...}
? I see no reason to.
– egreg
yesterday
By itself: A displays as {A}. In the use case, composition is desirable. If the text intofun
is generated by some macro, not directly entered,fun
won't process it. Because it seems the result is treated as {A} rather than A. Even though it is A. Single object. fun sees no separators when Ab Cd Ef = macro{test} and fun{macro{test}}.
– Guido Jorg
yesterday
|
show 2 more comments
@GuidoJorg That's very vague.
– egreg
yesterday
@GuidoJorg That makes things even more obscure.
– egreg
yesterday
Simplest example:fun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}' displays
Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco` not the result offun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
. Due to extra{}
. What should be done sofun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
displays whenfun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}
is entered?
– Guido Jorg
yesterday
@GuidoJorg Why shouldfun{{...}}
give the same result asfun{...}
? I see no reason to.
– egreg
yesterday
By itself: A displays as {A}. In the use case, composition is desirable. If the text intofun
is generated by some macro, not directly entered,fun
won't process it. Because it seems the result is treated as {A} rather than A. Even though it is A. Single object. fun sees no separators when Ab Cd Ef = macro{test} and fun{macro{test}}.
– Guido Jorg
yesterday
@GuidoJorg That's very vague.
– egreg
yesterday
@GuidoJorg That's very vague.
– egreg
yesterday
@GuidoJorg That makes things even more obscure.
– egreg
yesterday
@GuidoJorg That makes things even more obscure.
– egreg
yesterday
Simplest example:
fun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}' displays
Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco` not the result of fun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
. Due to extra {}
. What should be done so fun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
displays when fun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}
is entered?– Guido Jorg
yesterday
Simplest example:
fun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}' displays
Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco` not the result of fun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
. Due to extra {}
. What should be done so fun{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}
displays when fun{{Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco}}
is entered?– Guido Jorg
yesterday
@GuidoJorg Why should
fun{{...}}
give the same result as fun{...}
? I see no reason to.– egreg
yesterday
@GuidoJorg Why should
fun{{...}}
give the same result as fun{...}
? I see no reason to.– egreg
yesterday
By itself: A displays as {A}. In the use case, composition is desirable. If the text into
fun
is generated by some macro, not directly entered, fun
won't process it. Because it seems the result is treated as {A} rather than A. Even though it is A. Single object. fun sees no separators when Ab Cd Ef = macro{test} and fun{macro{test}}.– Guido Jorg
yesterday
By itself: A displays as {A}. In the use case, composition is desirable. If the text into
fun
is generated by some macro, not directly entered, fun
won't process it. Because it seems the result is treated as {A} rather than A. Even though it is A. Single object. fun sees no separators when Ab Cd Ef = macro{test} and fun{macro{test}}.– Guido Jorg
yesterday
|
show 2 more comments
(updated this answer signficantly to allow for multiple (expandable) macros in the argument of fun
.)
Here's a LuaLaTeX-based solution. It can handle multiple, expandable macros in the argument of fun
. The Lua code first splits the (expanded) input string into separate words, taking note of punctuation characters, if present. It then proceeds to print them, encasing the 3rd, 8th, 13th, 18th words in the form
macro. (Mathematically speaking, the selection criterion is that the word's position in the table, modulo 4, equals 3.) Non-ASCII UTF8-encoded characters are fine (because the unicode.utf8.gmatch
function rather than the "basic" string.gmatch
function is employed.)
% !TEX TS-program = lualatex
documentclass{article}
usepackage{luacode} % for 'luacode' environment and 'luastring' macro
%% Lua-side code
begin{luacode}
function do_fun ( s )
words = {} -- initialize a Lua table
-- split 's' into constituent words
for word in unicode.utf8.gmatch ( s , "%w+%p?" ) do
table.insert ( words , word )
end
-- apply "form" macro at 3rd, 8th, 13th, etc words
for i = 1 , #words do
if i%5 == 3 then
tex.sprint ( "\form{"..words[i].."} " )
else
tex.sprint ( words[i].." " )
end
end
end
end{luacode}
%% TeX-side code
newcommandfun[1]{directlua{do_fun(luastring{#1})}}
newcommandform[1]{emph{#1}}
newcommandblurbA{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris.}
newcommandblurbB{Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant.}
newcommandblurbC{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF4 xyz4 efg jkl abc5 EDF5 xyz5 efg jkl abc6 EDF6 xyz6 efg jkl abc7 EDF7 xyz7 efg jkl abc8 EDF8 xyz8 efg jkl abc9 EDF9 xyz9 efg jkl abc10 EDF10 xyz10 efg jkl abc11 EDF11 xyz11 efg jkl abc12 EDF12 xyz12 efg jkl abc13 EDF13 xyz13}
begin{document}
raggedright
fun{blurbAblurbBblurbC}
end{document}
Probably cannot use for a journal but LuaLaTex solutions are very elegant. I will look at LuaTex some more for personal use, have not used it much before.
– Guido Jorg
yesterday
1
@GuidoJorg - Some, but certainly not all, journals by now allow LuaLaTeX in addition to pdfLaTeX.
– Mico
yesterday
add a comment |
(updated this answer signficantly to allow for multiple (expandable) macros in the argument of fun
.)
Here's a LuaLaTeX-based solution. It can handle multiple, expandable macros in the argument of fun
. The Lua code first splits the (expanded) input string into separate words, taking note of punctuation characters, if present. It then proceeds to print them, encasing the 3rd, 8th, 13th, 18th words in the form
macro. (Mathematically speaking, the selection criterion is that the word's position in the table, modulo 4, equals 3.) Non-ASCII UTF8-encoded characters are fine (because the unicode.utf8.gmatch
function rather than the "basic" string.gmatch
function is employed.)
% !TEX TS-program = lualatex
documentclass{article}
usepackage{luacode} % for 'luacode' environment and 'luastring' macro
%% Lua-side code
begin{luacode}
function do_fun ( s )
words = {} -- initialize a Lua table
-- split 's' into constituent words
for word in unicode.utf8.gmatch ( s , "%w+%p?" ) do
table.insert ( words , word )
end
-- apply "form" macro at 3rd, 8th, 13th, etc words
for i = 1 , #words do
if i%5 == 3 then
tex.sprint ( "\form{"..words[i].."} " )
else
tex.sprint ( words[i].." " )
end
end
end
end{luacode}
%% TeX-side code
newcommandfun[1]{directlua{do_fun(luastring{#1})}}
newcommandform[1]{emph{#1}}
newcommandblurbA{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris.}
newcommandblurbB{Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant.}
newcommandblurbC{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF4 xyz4 efg jkl abc5 EDF5 xyz5 efg jkl abc6 EDF6 xyz6 efg jkl abc7 EDF7 xyz7 efg jkl abc8 EDF8 xyz8 efg jkl abc9 EDF9 xyz9 efg jkl abc10 EDF10 xyz10 efg jkl abc11 EDF11 xyz11 efg jkl abc12 EDF12 xyz12 efg jkl abc13 EDF13 xyz13}
begin{document}
raggedright
fun{blurbAblurbBblurbC}
end{document}
Probably cannot use for a journal but LuaLaTex solutions are very elegant. I will look at LuaTex some more for personal use, have not used it much before.
– Guido Jorg
yesterday
1
@GuidoJorg - Some, but certainly not all, journals by now allow LuaLaTeX in addition to pdfLaTeX.
– Mico
yesterday
add a comment |
(updated this answer signficantly to allow for multiple (expandable) macros in the argument of fun
.)
Here's a LuaLaTeX-based solution. It can handle multiple, expandable macros in the argument of fun
. The Lua code first splits the (expanded) input string into separate words, taking note of punctuation characters, if present. It then proceeds to print them, encasing the 3rd, 8th, 13th, 18th words in the form
macro. (Mathematically speaking, the selection criterion is that the word's position in the table, modulo 4, equals 3.) Non-ASCII UTF8-encoded characters are fine (because the unicode.utf8.gmatch
function rather than the "basic" string.gmatch
function is employed.)
% !TEX TS-program = lualatex
documentclass{article}
usepackage{luacode} % for 'luacode' environment and 'luastring' macro
%% Lua-side code
begin{luacode}
function do_fun ( s )
words = {} -- initialize a Lua table
-- split 's' into constituent words
for word in unicode.utf8.gmatch ( s , "%w+%p?" ) do
table.insert ( words , word )
end
-- apply "form" macro at 3rd, 8th, 13th, etc words
for i = 1 , #words do
if i%5 == 3 then
tex.sprint ( "\form{"..words[i].."} " )
else
tex.sprint ( words[i].." " )
end
end
end
end{luacode}
%% TeX-side code
newcommandfun[1]{directlua{do_fun(luastring{#1})}}
newcommandform[1]{emph{#1}}
newcommandblurbA{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris.}
newcommandblurbB{Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant.}
newcommandblurbC{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF4 xyz4 efg jkl abc5 EDF5 xyz5 efg jkl abc6 EDF6 xyz6 efg jkl abc7 EDF7 xyz7 efg jkl abc8 EDF8 xyz8 efg jkl abc9 EDF9 xyz9 efg jkl abc10 EDF10 xyz10 efg jkl abc11 EDF11 xyz11 efg jkl abc12 EDF12 xyz12 efg jkl abc13 EDF13 xyz13}
begin{document}
raggedright
fun{blurbAblurbBblurbC}
end{document}
(updated this answer signficantly to allow for multiple (expandable) macros in the argument of fun
.)
Here's a LuaLaTeX-based solution. It can handle multiple, expandable macros in the argument of fun
. The Lua code first splits the (expanded) input string into separate words, taking note of punctuation characters, if present. It then proceeds to print them, encasing the 3rd, 8th, 13th, 18th words in the form
macro. (Mathematically speaking, the selection criterion is that the word's position in the table, modulo 4, equals 3.) Non-ASCII UTF8-encoded characters are fine (because the unicode.utf8.gmatch
function rather than the "basic" string.gmatch
function is employed.)
% !TEX TS-program = lualatex
documentclass{article}
usepackage{luacode} % for 'luacode' environment and 'luastring' macro
%% Lua-side code
begin{luacode}
function do_fun ( s )
words = {} -- initialize a Lua table
-- split 's' into constituent words
for word in unicode.utf8.gmatch ( s , "%w+%p?" ) do
table.insert ( words , word )
end
-- apply "form" macro at 3rd, 8th, 13th, etc words
for i = 1 , #words do
if i%5 == 3 then
tex.sprint ( "\form{"..words[i].."} " )
else
tex.sprint ( words[i].." " )
end
end
end
end{luacode}
%% TeX-side code
newcommandfun[1]{directlua{do_fun(luastring{#1})}}
newcommandform[1]{emph{#1}}
newcommandblurbA{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris.}
newcommandblurbB{Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant.}
newcommandblurbC{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF4 xyz4 efg jkl abc5 EDF5 xyz5 efg jkl abc6 EDF6 xyz6 efg jkl abc7 EDF7 xyz7 efg jkl abc8 EDF8 xyz8 efg jkl abc9 EDF9 xyz9 efg jkl abc10 EDF10 xyz10 efg jkl abc11 EDF11 xyz11 efg jkl abc12 EDF12 xyz12 efg jkl abc13 EDF13 xyz13}
begin{document}
raggedright
fun{blurbAblurbBblurbC}
end{document}
edited yesterday
answered yesterday
MicoMico
284k31388778
284k31388778
Probably cannot use for a journal but LuaLaTex solutions are very elegant. I will look at LuaTex some more for personal use, have not used it much before.
– Guido Jorg
yesterday
1
@GuidoJorg - Some, but certainly not all, journals by now allow LuaLaTeX in addition to pdfLaTeX.
– Mico
yesterday
add a comment |
Probably cannot use for a journal but LuaLaTex solutions are very elegant. I will look at LuaTex some more for personal use, have not used it much before.
– Guido Jorg
yesterday
1
@GuidoJorg - Some, but certainly not all, journals by now allow LuaLaTeX in addition to pdfLaTeX.
– Mico
yesterday
Probably cannot use for a journal but LuaLaTex solutions are very elegant. I will look at LuaTex some more for personal use, have not used it much before.
– Guido Jorg
yesterday
Probably cannot use for a journal but LuaLaTex solutions are very elegant. I will look at LuaTex some more for personal use, have not used it much before.
– Guido Jorg
yesterday
1
1
@GuidoJorg - Some, but certainly not all, journals by now allow LuaLaTeX in addition to pdfLaTeX.
– Mico
yesterday
@GuidoJorg - Some, but certainly not all, journals by now allow LuaLaTeX in addition to pdfLaTeX.
– Mico
yesterday
add a comment |
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcounter{formtrigger}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{ }%
readlist*funlist{#1}%
setcounter{formtrigger}{2}%
foreachitemxinfunlist{%
stepcounter{formtrigger}%
ifnumtheformtrigger=5relax
form{x}setcounter{formtrigger}{0}%
else%
x%
fi%
%
}
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
end{document}
ORIGINAL ANSWER
The listofitems
package can grab these inputs very easily, preserving the original tokens without expansion.
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{ }%
readlistfunlist{#1}%
foreachitemxinfunlist{%
Argument xcnt{} istabto{1.3in}``detokenizeexpandafter{x}'':
tabto{2.5in}xpar
}%
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3
efg jkl abc4 EDF2 xyz4 ... abc1 EDF1 form{xyz1} efg jkl abc2
EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4
EDF2 form{xyz4} ...}
end{document}
If you need multi-layer parsing, say that efg jkl
is the trigger to separate larger subgroups of arguments, then we have the following (note: efg jkl
is not considered an argument, but an argument separator):
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{efg jkl/ }%
readlist*funlist{#1}%
foreachitemxinfunlist{%
foreachitemyinfunlist[xcnt]{%
Group xcnt{} sub-argument ycnt{} istabto{2in}``detokenize
expandafterexpandafterexpandafter{funlist[xcnt,ycnt]}'':
tabto{3.2in}funlist[xcnt,ycnt]par
}}%
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3
efg jkl abc4 EDF2 xyz4 ... abc1 EDF1 form{xyz1} efg jkl abc2
EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4
EDF2 form{xyz4} ...}
end{document}
Can you say how to get a sentence in one line to occur, rather than a list? Of the rightmost list in the image? (Also for learning how to write such macros, how does listofitems pull this off, can you suggest? I assume it checks ifx style whether the argument separator occurs or not to decide to loop and relies on a def that that takes one argument and has two cases ... Or calls a package with check for ifempty?)
– Guido Jorg
2 days ago
@GuidoJorg To learn about the package: ctan.org/pkg/listofitems
– Steven B. Segletes
2 days ago
@GuidoJorg As to your request, to make a sentence of the right hand column is not really to parse the list at all, but just to typeset the argument. So could you clarify what you are asking?
– Steven B. Segletes
2 days ago
The result looking for is what would be printed hadabc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
been entered manually. When in factfun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
was entered manually. Though the knowledge of how to parse the list completely is useful to know, as is the package, didn't know about it :)
– Guido Jorg
2 days ago
1
@GuidoJorg Please see my revision.
– Steven B. Segletes
yesterday
|
show 3 more comments
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcounter{formtrigger}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{ }%
readlist*funlist{#1}%
setcounter{formtrigger}{2}%
foreachitemxinfunlist{%
stepcounter{formtrigger}%
ifnumtheformtrigger=5relax
form{x}setcounter{formtrigger}{0}%
else%
x%
fi%
%
}
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
end{document}
ORIGINAL ANSWER
The listofitems
package can grab these inputs very easily, preserving the original tokens without expansion.
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{ }%
readlistfunlist{#1}%
foreachitemxinfunlist{%
Argument xcnt{} istabto{1.3in}``detokenizeexpandafter{x}'':
tabto{2.5in}xpar
}%
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3
efg jkl abc4 EDF2 xyz4 ... abc1 EDF1 form{xyz1} efg jkl abc2
EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4
EDF2 form{xyz4} ...}
end{document}
If you need multi-layer parsing, say that efg jkl
is the trigger to separate larger subgroups of arguments, then we have the following (note: efg jkl
is not considered an argument, but an argument separator):
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{efg jkl/ }%
readlist*funlist{#1}%
foreachitemxinfunlist{%
foreachitemyinfunlist[xcnt]{%
Group xcnt{} sub-argument ycnt{} istabto{2in}``detokenize
expandafterexpandafterexpandafter{funlist[xcnt,ycnt]}'':
tabto{3.2in}funlist[xcnt,ycnt]par
}}%
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3
efg jkl abc4 EDF2 xyz4 ... abc1 EDF1 form{xyz1} efg jkl abc2
EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4
EDF2 form{xyz4} ...}
end{document}
Can you say how to get a sentence in one line to occur, rather than a list? Of the rightmost list in the image? (Also for learning how to write such macros, how does listofitems pull this off, can you suggest? I assume it checks ifx style whether the argument separator occurs or not to decide to loop and relies on a def that that takes one argument and has two cases ... Or calls a package with check for ifempty?)
– Guido Jorg
2 days ago
@GuidoJorg To learn about the package: ctan.org/pkg/listofitems
– Steven B. Segletes
2 days ago
@GuidoJorg As to your request, to make a sentence of the right hand column is not really to parse the list at all, but just to typeset the argument. So could you clarify what you are asking?
– Steven B. Segletes
2 days ago
The result looking for is what would be printed hadabc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
been entered manually. When in factfun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
was entered manually. Though the knowledge of how to parse the list completely is useful to know, as is the package, didn't know about it :)
– Guido Jorg
2 days ago
1
@GuidoJorg Please see my revision.
– Steven B. Segletes
yesterday
|
show 3 more comments
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcounter{formtrigger}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{ }%
readlist*funlist{#1}%
setcounter{formtrigger}{2}%
foreachitemxinfunlist{%
stepcounter{formtrigger}%
ifnumtheformtrigger=5relax
form{x}setcounter{formtrigger}{0}%
else%
x%
fi%
%
}
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
end{document}
ORIGINAL ANSWER
The listofitems
package can grab these inputs very easily, preserving the original tokens without expansion.
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{ }%
readlistfunlist{#1}%
foreachitemxinfunlist{%
Argument xcnt{} istabto{1.3in}``detokenizeexpandafter{x}'':
tabto{2.5in}xpar
}%
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3
efg jkl abc4 EDF2 xyz4 ... abc1 EDF1 form{xyz1} efg jkl abc2
EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4
EDF2 form{xyz4} ...}
end{document}
If you need multi-layer parsing, say that efg jkl
is the trigger to separate larger subgroups of arguments, then we have the following (note: efg jkl
is not considered an argument, but an argument separator):
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{efg jkl/ }%
readlist*funlist{#1}%
foreachitemxinfunlist{%
foreachitemyinfunlist[xcnt]{%
Group xcnt{} sub-argument ycnt{} istabto{2in}``detokenize
expandafterexpandafterexpandafter{funlist[xcnt,ycnt]}'':
tabto{3.2in}funlist[xcnt,ycnt]par
}}%
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3
efg jkl abc4 EDF2 xyz4 ... abc1 EDF1 form{xyz1} efg jkl abc2
EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4
EDF2 form{xyz4} ...}
end{document}
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcounter{formtrigger}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{ }%
readlist*funlist{#1}%
setcounter{formtrigger}{2}%
foreachitemxinfunlist{%
stepcounter{formtrigger}%
ifnumtheformtrigger=5relax
form{x}setcounter{formtrigger}{0}%
else%
x%
fi%
%
}
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
end{document}
ORIGINAL ANSWER
The listofitems
package can grab these inputs very easily, preserving the original tokens without expansion.
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{ }%
readlistfunlist{#1}%
foreachitemxinfunlist{%
Argument xcnt{} istabto{1.3in}``detokenizeexpandafter{x}'':
tabto{2.5in}xpar
}%
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3
efg jkl abc4 EDF2 xyz4 ... abc1 EDF1 form{xyz1} efg jkl abc2
EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4
EDF2 form{xyz4} ...}
end{document}
If you need multi-layer parsing, say that efg jkl
is the trigger to separate larger subgroups of arguments, then we have the following (note: efg jkl
is not considered an argument, but an argument separator):
documentclass{article}
usepackage[T1]{fontenc}
usepackage{listofitems,tabto}
newcommandform[1]{emph{#1}}
newcommandfun[1]{%
setsepchar{efg jkl/ }%
readlist*funlist{#1}%
foreachitemxinfunlist{%
foreachitemyinfunlist[xcnt]{%
Group xcnt{} sub-argument ycnt{} istabto{2in}``detokenize
expandafterexpandafterexpandafter{funlist[xcnt,ycnt]}'':
tabto{3.2in}funlist[xcnt,ycnt]par
}}%
}
begin{document}
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3
efg jkl abc4 EDF2 xyz4 ... abc1 EDF1 form{xyz1} efg jkl abc2
EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4
EDF2 form{xyz4} ...}
end{document}
edited yesterday
answered 2 days ago
Steven B. SegletesSteven B. Segletes
159k9204412
159k9204412
Can you say how to get a sentence in one line to occur, rather than a list? Of the rightmost list in the image? (Also for learning how to write such macros, how does listofitems pull this off, can you suggest? I assume it checks ifx style whether the argument separator occurs or not to decide to loop and relies on a def that that takes one argument and has two cases ... Or calls a package with check for ifempty?)
– Guido Jorg
2 days ago
@GuidoJorg To learn about the package: ctan.org/pkg/listofitems
– Steven B. Segletes
2 days ago
@GuidoJorg As to your request, to make a sentence of the right hand column is not really to parse the list at all, but just to typeset the argument. So could you clarify what you are asking?
– Steven B. Segletes
2 days ago
The result looking for is what would be printed hadabc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
been entered manually. When in factfun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
was entered manually. Though the knowledge of how to parse the list completely is useful to know, as is the package, didn't know about it :)
– Guido Jorg
2 days ago
1
@GuidoJorg Please see my revision.
– Steven B. Segletes
yesterday
|
show 3 more comments
Can you say how to get a sentence in one line to occur, rather than a list? Of the rightmost list in the image? (Also for learning how to write such macros, how does listofitems pull this off, can you suggest? I assume it checks ifx style whether the argument separator occurs or not to decide to loop and relies on a def that that takes one argument and has two cases ... Or calls a package with check for ifempty?)
– Guido Jorg
2 days ago
@GuidoJorg To learn about the package: ctan.org/pkg/listofitems
– Steven B. Segletes
2 days ago
@GuidoJorg As to your request, to make a sentence of the right hand column is not really to parse the list at all, but just to typeset the argument. So could you clarify what you are asking?
– Steven B. Segletes
2 days ago
The result looking for is what would be printed hadabc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
been entered manually. When in factfun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
was entered manually. Though the knowledge of how to parse the list completely is useful to know, as is the package, didn't know about it :)
– Guido Jorg
2 days ago
1
@GuidoJorg Please see my revision.
– Steven B. Segletes
yesterday
Can you say how to get a sentence in one line to occur, rather than a list? Of the rightmost list in the image? (Also for learning how to write such macros, how does listofitems pull this off, can you suggest? I assume it checks ifx style whether the argument separator occurs or not to decide to loop and relies on a def that that takes one argument and has two cases ... Or calls a package with check for ifempty?)
– Guido Jorg
2 days ago
Can you say how to get a sentence in one line to occur, rather than a list? Of the rightmost list in the image? (Also for learning how to write such macros, how does listofitems pull this off, can you suggest? I assume it checks ifx style whether the argument separator occurs or not to decide to loop and relies on a def that that takes one argument and has two cases ... Or calls a package with check for ifempty?)
– Guido Jorg
2 days ago
@GuidoJorg To learn about the package: ctan.org/pkg/listofitems
– Steven B. Segletes
2 days ago
@GuidoJorg To learn about the package: ctan.org/pkg/listofitems
– Steven B. Segletes
2 days ago
@GuidoJorg As to your request, to make a sentence of the right hand column is not really to parse the list at all, but just to typeset the argument. So could you clarify what you are asking?
– Steven B. Segletes
2 days ago
@GuidoJorg As to your request, to make a sentence of the right hand column is not really to parse the list at all, but just to typeset the argument. So could you clarify what you are asking?
– Steven B. Segletes
2 days ago
The result looking for is what would be printed had
abc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
been entered manually. When in fact fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
was entered manually. Though the knowledge of how to parse the list completely is useful to know, as is the package, didn't know about it :)– Guido Jorg
2 days ago
The result looking for is what would be printed had
abc1 EDF1 form{xyz1} efg jkl abc2 EDF2 form{xyz2} efg jkl abc3 EDF3 form{xyz3} efg jkl abc4 EDF2 form{xyz4} ...
been entered manually. When in fact fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ...}
was entered manually. Though the knowledge of how to parse the list completely is useful to know, as is the package, didn't know about it :)– Guido Jorg
2 days ago
1
1
@GuidoJorg Please see my revision.
– Steven B. Segletes
yesterday
@GuidoJorg Please see my revision.
– Steven B. Segletes
yesterday
|
show 3 more comments
Thanks for contributing an answer to TeX - LaTeX Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f480991%2fextract-more-than-nine-arguments-that-occur-periodically-in-a-sentence-to-use-in%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
fun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4}
andfun{abc1 EDF1 xyz1}
andfun{abc1 EDF1 xyz1 efg jkl abc2 EDF2 xyz2 efg jkl abc3 EDF3 xyz3 efg jkl abc4 EDF2 xyz4 ... efg jkl abc12 EDF12 xyz12}
, etc, equally possible. Some kind of loop required. But note that there would not appear any numbers in the input phrase; the numbers are here to illustrate how long happens to be the list. Just the list is always entered as a specific kind of sentence.– Guido Jorg
2 days ago
Splitting such an input at spaces is easy, and testing for some regular expression too (with expl3) but your description is a bit confusing.
– Ulrike Fischer
2 days ago
Without knowing the rules for applying
form
it's really difficult to answer.– egreg
2 days ago
@GuidoJorg I'm not asking what
form
should do, but to which parts it should be applied. Some real world examples might help to understand. As the question stands, it's impossible to guess.– egreg
2 days ago
@egreg to the 3rd, 8th, 13th, 18th ... word in the sentence. Separator can be assumed to repeat. form affects only these parts. And sentence can be arbitrarily long and will end without the separator.
– Guido Jorg
2 days ago