How can I replace every global instance of “x[2]” with “x_2”
This is a slightly different question to what I've seen before, where I can use something like newcommand{ga}{gamma}
to make shortcuts of things using .
I have a series of LONG equations with stuff like x[2]
or a[3]
in them. I want to be able to always replace any instance of them with something else, like a command that takes a string and replaces it like something similar to
newcommand{x[2]}{x_2}
and
newcommand{a[2]}{beta}
Ideally, this would take account of the number inside, but I could easily just do it for all instances that arise. Any guidance would be great (my document class is Report)
macros shorthands
|
show 3 more comments
This is a slightly different question to what I've seen before, where I can use something like newcommand{ga}{gamma}
to make shortcuts of things using .
I have a series of LONG equations with stuff like x[2]
or a[3]
in them. I want to be able to always replace any instance of them with something else, like a command that takes a string and replaces it like something similar to
newcommand{x[2]}{x_2}
and
newcommand{a[2]}{beta}
Ideally, this would take account of the number inside, but I could easily just do it for all instances that arise. Any guidance would be great (my document class is Report)
macros shorthands
Sort of sounds like translating math equations from one syntax to another, which reminded me of my very strange answer here: tex.stackexchange.com/questions/332012/…. Not that it will help you in the present case, without significant rework.
– Steven B. Segletes
15 hours ago
1
Do you absolutely need to convert as you typeset, or can you convert your source? If the latter, do you think it would be possible to unambiguously define all the situations in which this syntax would occur?
– Chris H
15 hours ago
@ChrisH that's exactly what I'm hoping for. I'm copying some parts of equations from Mathematica, and is written in terms of coefficients likex[2]
for example, where I avoided subscripts in my code. I now want to save myself effort and simply definex[2] = x_2
in Latex, since it'll only ever occur within an equation.
– Brad
15 hours ago
@StevenB.Segletes thank you for your post - Remarkably strange answer for that question, but I'll bear it in mind! I'm sure there must be a simpler way.
– Brad
15 hours ago
2
My editor of choice supports regex find/replace so I'd simply findx[([0-9])]
and replace withx_$1
(on a copy of course)
– Chris H
15 hours ago
|
show 3 more comments
This is a slightly different question to what I've seen before, where I can use something like newcommand{ga}{gamma}
to make shortcuts of things using .
I have a series of LONG equations with stuff like x[2]
or a[3]
in them. I want to be able to always replace any instance of them with something else, like a command that takes a string and replaces it like something similar to
newcommand{x[2]}{x_2}
and
newcommand{a[2]}{beta}
Ideally, this would take account of the number inside, but I could easily just do it for all instances that arise. Any guidance would be great (my document class is Report)
macros shorthands
This is a slightly different question to what I've seen before, where I can use something like newcommand{ga}{gamma}
to make shortcuts of things using .
I have a series of LONG equations with stuff like x[2]
or a[3]
in them. I want to be able to always replace any instance of them with something else, like a command that takes a string and replaces it like something similar to
newcommand{x[2]}{x_2}
and
newcommand{a[2]}{beta}
Ideally, this would take account of the number inside, but I could easily just do it for all instances that arise. Any guidance would be great (my document class is Report)
macros shorthands
macros shorthands
asked 15 hours ago
BradBrad
482
482
Sort of sounds like translating math equations from one syntax to another, which reminded me of my very strange answer here: tex.stackexchange.com/questions/332012/…. Not that it will help you in the present case, without significant rework.
– Steven B. Segletes
15 hours ago
1
Do you absolutely need to convert as you typeset, or can you convert your source? If the latter, do you think it would be possible to unambiguously define all the situations in which this syntax would occur?
– Chris H
15 hours ago
@ChrisH that's exactly what I'm hoping for. I'm copying some parts of equations from Mathematica, and is written in terms of coefficients likex[2]
for example, where I avoided subscripts in my code. I now want to save myself effort and simply definex[2] = x_2
in Latex, since it'll only ever occur within an equation.
– Brad
15 hours ago
@StevenB.Segletes thank you for your post - Remarkably strange answer for that question, but I'll bear it in mind! I'm sure there must be a simpler way.
– Brad
15 hours ago
2
My editor of choice supports regex find/replace so I'd simply findx[([0-9])]
and replace withx_$1
(on a copy of course)
– Chris H
15 hours ago
|
show 3 more comments
Sort of sounds like translating math equations from one syntax to another, which reminded me of my very strange answer here: tex.stackexchange.com/questions/332012/…. Not that it will help you in the present case, without significant rework.
– Steven B. Segletes
15 hours ago
1
Do you absolutely need to convert as you typeset, or can you convert your source? If the latter, do you think it would be possible to unambiguously define all the situations in which this syntax would occur?
– Chris H
15 hours ago
@ChrisH that's exactly what I'm hoping for. I'm copying some parts of equations from Mathematica, and is written in terms of coefficients likex[2]
for example, where I avoided subscripts in my code. I now want to save myself effort and simply definex[2] = x_2
in Latex, since it'll only ever occur within an equation.
– Brad
15 hours ago
@StevenB.Segletes thank you for your post - Remarkably strange answer for that question, but I'll bear it in mind! I'm sure there must be a simpler way.
– Brad
15 hours ago
2
My editor of choice supports regex find/replace so I'd simply findx[([0-9])]
and replace withx_$1
(on a copy of course)
– Chris H
15 hours ago
Sort of sounds like translating math equations from one syntax to another, which reminded me of my very strange answer here: tex.stackexchange.com/questions/332012/…. Not that it will help you in the present case, without significant rework.
– Steven B. Segletes
15 hours ago
Sort of sounds like translating math equations from one syntax to another, which reminded me of my very strange answer here: tex.stackexchange.com/questions/332012/…. Not that it will help you in the present case, without significant rework.
– Steven B. Segletes
15 hours ago
1
1
Do you absolutely need to convert as you typeset, or can you convert your source? If the latter, do you think it would be possible to unambiguously define all the situations in which this syntax would occur?
– Chris H
15 hours ago
Do you absolutely need to convert as you typeset, or can you convert your source? If the latter, do you think it would be possible to unambiguously define all the situations in which this syntax would occur?
– Chris H
15 hours ago
@ChrisH that's exactly what I'm hoping for. I'm copying some parts of equations from Mathematica, and is written in terms of coefficients like
x[2]
for example, where I avoided subscripts in my code. I now want to save myself effort and simply define x[2] = x_2
in Latex, since it'll only ever occur within an equation.– Brad
15 hours ago
@ChrisH that's exactly what I'm hoping for. I'm copying some parts of equations from Mathematica, and is written in terms of coefficients like
x[2]
for example, where I avoided subscripts in my code. I now want to save myself effort and simply define x[2] = x_2
in Latex, since it'll only ever occur within an equation.– Brad
15 hours ago
@StevenB.Segletes thank you for your post - Remarkably strange answer for that question, but I'll bear it in mind! I'm sure there must be a simpler way.
– Brad
15 hours ago
@StevenB.Segletes thank you for your post - Remarkably strange answer for that question, but I'll bear it in mind! I'm sure there must be a simpler way.
– Brad
15 hours ago
2
2
My editor of choice supports regex find/replace so I'd simply find
x[([0-9])]
and replace with x_$1
(on a copy of course)– Chris H
15 hours ago
My editor of choice supports regex find/replace so I'd simply find
x[([0-9])]
and replace with x_$1
(on a copy of course)– Chris H
15 hours ago
|
show 3 more comments
6 Answers
6
active
oldest
votes
An extensible set of replacements:
documentclass{article}
usepackage{amsmath}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{trans}{m}
{
tl_set:Nn l__brad_trans_tl { #1 }
regex_replace_all:nnN { [(.*?)] } { c{sb}cB{1cE} } l__brad_trans_tl
regex_replace_all:nnN { a } { c{alpha} } l__brad_trans_tl
% other replacements
% ...
% deliver the new token list
l__brad_trans_tl
}
ExplSyntaxOff
begin{document}
$trans{x[1]+x[2]^2+a+a[3]}$
end{document}
1
Same comment as I made on David's answer. Yes, myl3regex
is sometimes useful, but here the right solution by far is to do the replacements in Mathematica, not TeX.
– Bruno Le Floch
12 hours ago
add a comment |
I really can not recommend doing this, but as you ask...
documentclass{article}
begin{document}
mathcode`[="8000
mathcode`]="8000
{
catcode`[=active gdef[{_bgroup}
catcode`]=active gdef]{egroup}
}
hmmm
[
a[1]+a[2]+b[c+d[3]] + x
]
end{document}
Thank you for your answer - this is not quite what I'm after. But since this is not quite a conventional method, perhaps I am better simply going through and replacing things manually... I am moreso hoping to simply find a particular string and replace it with something else.
– Brad
15 hours ago
@Brad that really isn't how tex works:-) (unless you are using luatex)
– David Carlisle
15 hours ago
No worries at all! I have no problem sorting through everything, but I was hoping to save myself a bit of eyesight. Thank you for your help regardless!
– Brad
15 hours ago
@DavidCarlisle Come on, don't advocate crazy solutions to problems that can be trivially solved on the other side of the conversion. Brad should simply do the replacement in Mathematica.
– Bruno Le Floch
12 hours ago
1
@BrunoLeFloch I'd already said that in comments under the question, or just use perl or any other sane mechanism, but it's easy for you to see that this is beyond what's reasonable to do in tex as you know more than most on where tex's limits are, but I think it is still useful as a general rule to sketch how far you can get (and in particular what you can not reasonably do) in tex for this kind of question.
– David Carlisle
11 hours ago
add a comment |
Along the vein of my cited Translate in-line equations to TeX code (Any Package?), but a much simpler parsing request, I provide translate
.
No catcode changes required. It will retain surrounding math style, etc.
documentclass{article}
usepackage{listofitems}
newtokseqtoks
newcommandaddtoeqtoks[1]{expandaftereqtoksexpandafter{theeqtoks#1}}
newcommandtranslate[1]{%
setsepchar{[||]}%
readlistmyeqn{#1}%
eqtoks{}%
foreachitemxinmyeqn{%
ifnumxcnt=1else%
if[myeqnsep[numexprxcnt-1]addtoeqtoks{_bgroup}fi%
if]myeqnsep[numexprxcnt-1]addtoeqtoks{egroup}fi%
fi%
expandafteraddtoeqtoksexpandafter{x}%
}%
theeqtoks%
}
begin{document}
[
translate{a[1]+a[2]+b[c+d[3]] + x}
]
end{document}
add a comment |
Inasmuch as I love doing crazy things in TeX, do the replacements in Mathematica! This will save you a huge amount of pain. For instance,
expr = (a[1] + a[2])/Sqrt[a[3]]
expr /. {a[1] -> [Alpha], a[2] -> [Beta], a[3] -> [Gamma]} // TeXForm
gives frac{alpha +beta }{sqrt{gamma }}
with no need to tweak the output.
add a comment |
Here's a solution. The command addreplacementrule{text-to-replace}{replacement-text}
specifies replacements to make. Then the command replace{some math}
does the replacements.
This would probably be better done with the l3regex package or really find and replace as many other people mentioned.
documentclass{article}
makeatletter
newtoksri@activechars
defaddreplacementrule#1#2{addreplacementrule@#1@nil{#2}}
defaddreplacementrule@#1#2@nil#3{%
ri@activecharsexpandafter{theri@activechars\#1}%
ri@maketransitions#2@nil{#1}{#3}%
}
defreplace#1{%
begingroup
def\##1{%
bgrouplccode`~=`##1lowercase{egroup
def~{ri@continue{##1}}%
}%
catcode`##1=active
}%
theri@activechars
scantokens{#1}%
endgroup
}
defri@maketransitions#1#2@nil#3#4{%
deftemp{#2}%
ifxtempempty
expandafterdefcsname ri@lookup@detokenize{#3#1}endcsname{#4}%
letnextrelax
else
expandafterdefcsname ri@lookup@detokenize{#3#1}endcsname{ri@continue{#3#1}}%
defnext{ri@maketransitions#2@nil{#3#1}{#4}}%
fi
next
}
defri@continue#1#2{%
@ifundefined{ri@lookup@detokenize{#1#2}}{%
detokenize{#1}#2%
}{%
csname ri@lookup@detokenize{#1#2}endcsname
}%
}
begin{document}
addreplacementrule{x[2]}{x_2}
addreplacementrule{x[3]}{x^2}
$x+1+x[2]+x[3]+x[1]$
replace{$x+1+x[2]+x[3]+x[1]$}
end{document}
add a comment |
For the sake of variety, here's a LuaLaTeX-based solution. It sets up a Lua function, called trans
, which does most of the work with the help of Lua's versatile string-handling routines. The LaTeX macro trans
is a wrapper that invokes the Lua function.
documentclass{article}
usepackage{luacode} % for "luacode" environment and "luastringN" macro
begin{luacode}
function makesubscr ( s )
s = s:gsub ( "(%b)", function(x)
return ( "_{" .. string.sub ( x , 2 , -2 ) .. "}" )
end )
if s:find ( "%b" ) then
s = makesubscr ( s )
end
return s
end
function trans ( s )
s = makesubscr ( s )
s = s:gsub ( "a" , "\alpha" )
s = s:gsub ( "b" , "\beta" )
tex.sprint ( s )
end
end{luacode}
%% TeX-side code
newcommandtrans[1]{directlua{trans(luastringN{#1})}}
begin{document}
$trans{x[1]+x[2]^2+a+a[3]}$
$trans{a[1]+a[2]+b[c+d[3]]+x}$
end{document}
add a comment |
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%2f481546%2fhow-can-i-replace-every-global-instance-of-x2-with-x-2%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
An extensible set of replacements:
documentclass{article}
usepackage{amsmath}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{trans}{m}
{
tl_set:Nn l__brad_trans_tl { #1 }
regex_replace_all:nnN { [(.*?)] } { c{sb}cB{1cE} } l__brad_trans_tl
regex_replace_all:nnN { a } { c{alpha} } l__brad_trans_tl
% other replacements
% ...
% deliver the new token list
l__brad_trans_tl
}
ExplSyntaxOff
begin{document}
$trans{x[1]+x[2]^2+a+a[3]}$
end{document}
1
Same comment as I made on David's answer. Yes, myl3regex
is sometimes useful, but here the right solution by far is to do the replacements in Mathematica, not TeX.
– Bruno Le Floch
12 hours ago
add a comment |
An extensible set of replacements:
documentclass{article}
usepackage{amsmath}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{trans}{m}
{
tl_set:Nn l__brad_trans_tl { #1 }
regex_replace_all:nnN { [(.*?)] } { c{sb}cB{1cE} } l__brad_trans_tl
regex_replace_all:nnN { a } { c{alpha} } l__brad_trans_tl
% other replacements
% ...
% deliver the new token list
l__brad_trans_tl
}
ExplSyntaxOff
begin{document}
$trans{x[1]+x[2]^2+a+a[3]}$
end{document}
1
Same comment as I made on David's answer. Yes, myl3regex
is sometimes useful, but here the right solution by far is to do the replacements in Mathematica, not TeX.
– Bruno Le Floch
12 hours ago
add a comment |
An extensible set of replacements:
documentclass{article}
usepackage{amsmath}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{trans}{m}
{
tl_set:Nn l__brad_trans_tl { #1 }
regex_replace_all:nnN { [(.*?)] } { c{sb}cB{1cE} } l__brad_trans_tl
regex_replace_all:nnN { a } { c{alpha} } l__brad_trans_tl
% other replacements
% ...
% deliver the new token list
l__brad_trans_tl
}
ExplSyntaxOff
begin{document}
$trans{x[1]+x[2]^2+a+a[3]}$
end{document}
An extensible set of replacements:
documentclass{article}
usepackage{amsmath}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{trans}{m}
{
tl_set:Nn l__brad_trans_tl { #1 }
regex_replace_all:nnN { [(.*?)] } { c{sb}cB{1cE} } l__brad_trans_tl
regex_replace_all:nnN { a } { c{alpha} } l__brad_trans_tl
% other replacements
% ...
% deliver the new token list
l__brad_trans_tl
}
ExplSyntaxOff
begin{document}
$trans{x[1]+x[2]^2+a+a[3]}$
end{document}
answered 13 hours ago
egregegreg
729k8819263237
729k8819263237
1
Same comment as I made on David's answer. Yes, myl3regex
is sometimes useful, but here the right solution by far is to do the replacements in Mathematica, not TeX.
– Bruno Le Floch
12 hours ago
add a comment |
1
Same comment as I made on David's answer. Yes, myl3regex
is sometimes useful, but here the right solution by far is to do the replacements in Mathematica, not TeX.
– Bruno Le Floch
12 hours ago
1
1
Same comment as I made on David's answer. Yes, my
l3regex
is sometimes useful, but here the right solution by far is to do the replacements in Mathematica, not TeX.– Bruno Le Floch
12 hours ago
Same comment as I made on David's answer. Yes, my
l3regex
is sometimes useful, but here the right solution by far is to do the replacements in Mathematica, not TeX.– Bruno Le Floch
12 hours ago
add a comment |
I really can not recommend doing this, but as you ask...
documentclass{article}
begin{document}
mathcode`[="8000
mathcode`]="8000
{
catcode`[=active gdef[{_bgroup}
catcode`]=active gdef]{egroup}
}
hmmm
[
a[1]+a[2]+b[c+d[3]] + x
]
end{document}
Thank you for your answer - this is not quite what I'm after. But since this is not quite a conventional method, perhaps I am better simply going through and replacing things manually... I am moreso hoping to simply find a particular string and replace it with something else.
– Brad
15 hours ago
@Brad that really isn't how tex works:-) (unless you are using luatex)
– David Carlisle
15 hours ago
No worries at all! I have no problem sorting through everything, but I was hoping to save myself a bit of eyesight. Thank you for your help regardless!
– Brad
15 hours ago
@DavidCarlisle Come on, don't advocate crazy solutions to problems that can be trivially solved on the other side of the conversion. Brad should simply do the replacement in Mathematica.
– Bruno Le Floch
12 hours ago
1
@BrunoLeFloch I'd already said that in comments under the question, or just use perl or any other sane mechanism, but it's easy for you to see that this is beyond what's reasonable to do in tex as you know more than most on where tex's limits are, but I think it is still useful as a general rule to sketch how far you can get (and in particular what you can not reasonably do) in tex for this kind of question.
– David Carlisle
11 hours ago
add a comment |
I really can not recommend doing this, but as you ask...
documentclass{article}
begin{document}
mathcode`[="8000
mathcode`]="8000
{
catcode`[=active gdef[{_bgroup}
catcode`]=active gdef]{egroup}
}
hmmm
[
a[1]+a[2]+b[c+d[3]] + x
]
end{document}
Thank you for your answer - this is not quite what I'm after. But since this is not quite a conventional method, perhaps I am better simply going through and replacing things manually... I am moreso hoping to simply find a particular string and replace it with something else.
– Brad
15 hours ago
@Brad that really isn't how tex works:-) (unless you are using luatex)
– David Carlisle
15 hours ago
No worries at all! I have no problem sorting through everything, but I was hoping to save myself a bit of eyesight. Thank you for your help regardless!
– Brad
15 hours ago
@DavidCarlisle Come on, don't advocate crazy solutions to problems that can be trivially solved on the other side of the conversion. Brad should simply do the replacement in Mathematica.
– Bruno Le Floch
12 hours ago
1
@BrunoLeFloch I'd already said that in comments under the question, or just use perl or any other sane mechanism, but it's easy for you to see that this is beyond what's reasonable to do in tex as you know more than most on where tex's limits are, but I think it is still useful as a general rule to sketch how far you can get (and in particular what you can not reasonably do) in tex for this kind of question.
– David Carlisle
11 hours ago
add a comment |
I really can not recommend doing this, but as you ask...
documentclass{article}
begin{document}
mathcode`[="8000
mathcode`]="8000
{
catcode`[=active gdef[{_bgroup}
catcode`]=active gdef]{egroup}
}
hmmm
[
a[1]+a[2]+b[c+d[3]] + x
]
end{document}
I really can not recommend doing this, but as you ask...
documentclass{article}
begin{document}
mathcode`[="8000
mathcode`]="8000
{
catcode`[=active gdef[{_bgroup}
catcode`]=active gdef]{egroup}
}
hmmm
[
a[1]+a[2]+b[c+d[3]] + x
]
end{document}
answered 15 hours ago
David CarlisleDavid Carlisle
496k4111421889
496k4111421889
Thank you for your answer - this is not quite what I'm after. But since this is not quite a conventional method, perhaps I am better simply going through and replacing things manually... I am moreso hoping to simply find a particular string and replace it with something else.
– Brad
15 hours ago
@Brad that really isn't how tex works:-) (unless you are using luatex)
– David Carlisle
15 hours ago
No worries at all! I have no problem sorting through everything, but I was hoping to save myself a bit of eyesight. Thank you for your help regardless!
– Brad
15 hours ago
@DavidCarlisle Come on, don't advocate crazy solutions to problems that can be trivially solved on the other side of the conversion. Brad should simply do the replacement in Mathematica.
– Bruno Le Floch
12 hours ago
1
@BrunoLeFloch I'd already said that in comments under the question, or just use perl or any other sane mechanism, but it's easy for you to see that this is beyond what's reasonable to do in tex as you know more than most on where tex's limits are, but I think it is still useful as a general rule to sketch how far you can get (and in particular what you can not reasonably do) in tex for this kind of question.
– David Carlisle
11 hours ago
add a comment |
Thank you for your answer - this is not quite what I'm after. But since this is not quite a conventional method, perhaps I am better simply going through and replacing things manually... I am moreso hoping to simply find a particular string and replace it with something else.
– Brad
15 hours ago
@Brad that really isn't how tex works:-) (unless you are using luatex)
– David Carlisle
15 hours ago
No worries at all! I have no problem sorting through everything, but I was hoping to save myself a bit of eyesight. Thank you for your help regardless!
– Brad
15 hours ago
@DavidCarlisle Come on, don't advocate crazy solutions to problems that can be trivially solved on the other side of the conversion. Brad should simply do the replacement in Mathematica.
– Bruno Le Floch
12 hours ago
1
@BrunoLeFloch I'd already said that in comments under the question, or just use perl or any other sane mechanism, but it's easy for you to see that this is beyond what's reasonable to do in tex as you know more than most on where tex's limits are, but I think it is still useful as a general rule to sketch how far you can get (and in particular what you can not reasonably do) in tex for this kind of question.
– David Carlisle
11 hours ago
Thank you for your answer - this is not quite what I'm after. But since this is not quite a conventional method, perhaps I am better simply going through and replacing things manually... I am moreso hoping to simply find a particular string and replace it with something else.
– Brad
15 hours ago
Thank you for your answer - this is not quite what I'm after. But since this is not quite a conventional method, perhaps I am better simply going through and replacing things manually... I am moreso hoping to simply find a particular string and replace it with something else.
– Brad
15 hours ago
@Brad that really isn't how tex works:-) (unless you are using luatex)
– David Carlisle
15 hours ago
@Brad that really isn't how tex works:-) (unless you are using luatex)
– David Carlisle
15 hours ago
No worries at all! I have no problem sorting through everything, but I was hoping to save myself a bit of eyesight. Thank you for your help regardless!
– Brad
15 hours ago
No worries at all! I have no problem sorting through everything, but I was hoping to save myself a bit of eyesight. Thank you for your help regardless!
– Brad
15 hours ago
@DavidCarlisle Come on, don't advocate crazy solutions to problems that can be trivially solved on the other side of the conversion. Brad should simply do the replacement in Mathematica.
– Bruno Le Floch
12 hours ago
@DavidCarlisle Come on, don't advocate crazy solutions to problems that can be trivially solved on the other side of the conversion. Brad should simply do the replacement in Mathematica.
– Bruno Le Floch
12 hours ago
1
1
@BrunoLeFloch I'd already said that in comments under the question, or just use perl or any other sane mechanism, but it's easy for you to see that this is beyond what's reasonable to do in tex as you know more than most on where tex's limits are, but I think it is still useful as a general rule to sketch how far you can get (and in particular what you can not reasonably do) in tex for this kind of question.
– David Carlisle
11 hours ago
@BrunoLeFloch I'd already said that in comments under the question, or just use perl or any other sane mechanism, but it's easy for you to see that this is beyond what's reasonable to do in tex as you know more than most on where tex's limits are, but I think it is still useful as a general rule to sketch how far you can get (and in particular what you can not reasonably do) in tex for this kind of question.
– David Carlisle
11 hours ago
add a comment |
Along the vein of my cited Translate in-line equations to TeX code (Any Package?), but a much simpler parsing request, I provide translate
.
No catcode changes required. It will retain surrounding math style, etc.
documentclass{article}
usepackage{listofitems}
newtokseqtoks
newcommandaddtoeqtoks[1]{expandaftereqtoksexpandafter{theeqtoks#1}}
newcommandtranslate[1]{%
setsepchar{[||]}%
readlistmyeqn{#1}%
eqtoks{}%
foreachitemxinmyeqn{%
ifnumxcnt=1else%
if[myeqnsep[numexprxcnt-1]addtoeqtoks{_bgroup}fi%
if]myeqnsep[numexprxcnt-1]addtoeqtoks{egroup}fi%
fi%
expandafteraddtoeqtoksexpandafter{x}%
}%
theeqtoks%
}
begin{document}
[
translate{a[1]+a[2]+b[c+d[3]] + x}
]
end{document}
add a comment |
Along the vein of my cited Translate in-line equations to TeX code (Any Package?), but a much simpler parsing request, I provide translate
.
No catcode changes required. It will retain surrounding math style, etc.
documentclass{article}
usepackage{listofitems}
newtokseqtoks
newcommandaddtoeqtoks[1]{expandaftereqtoksexpandafter{theeqtoks#1}}
newcommandtranslate[1]{%
setsepchar{[||]}%
readlistmyeqn{#1}%
eqtoks{}%
foreachitemxinmyeqn{%
ifnumxcnt=1else%
if[myeqnsep[numexprxcnt-1]addtoeqtoks{_bgroup}fi%
if]myeqnsep[numexprxcnt-1]addtoeqtoks{egroup}fi%
fi%
expandafteraddtoeqtoksexpandafter{x}%
}%
theeqtoks%
}
begin{document}
[
translate{a[1]+a[2]+b[c+d[3]] + x}
]
end{document}
add a comment |
Along the vein of my cited Translate in-line equations to TeX code (Any Package?), but a much simpler parsing request, I provide translate
.
No catcode changes required. It will retain surrounding math style, etc.
documentclass{article}
usepackage{listofitems}
newtokseqtoks
newcommandaddtoeqtoks[1]{expandaftereqtoksexpandafter{theeqtoks#1}}
newcommandtranslate[1]{%
setsepchar{[||]}%
readlistmyeqn{#1}%
eqtoks{}%
foreachitemxinmyeqn{%
ifnumxcnt=1else%
if[myeqnsep[numexprxcnt-1]addtoeqtoks{_bgroup}fi%
if]myeqnsep[numexprxcnt-1]addtoeqtoks{egroup}fi%
fi%
expandafteraddtoeqtoksexpandafter{x}%
}%
theeqtoks%
}
begin{document}
[
translate{a[1]+a[2]+b[c+d[3]] + x}
]
end{document}
Along the vein of my cited Translate in-line equations to TeX code (Any Package?), but a much simpler parsing request, I provide translate
.
No catcode changes required. It will retain surrounding math style, etc.
documentclass{article}
usepackage{listofitems}
newtokseqtoks
newcommandaddtoeqtoks[1]{expandaftereqtoksexpandafter{theeqtoks#1}}
newcommandtranslate[1]{%
setsepchar{[||]}%
readlistmyeqn{#1}%
eqtoks{}%
foreachitemxinmyeqn{%
ifnumxcnt=1else%
if[myeqnsep[numexprxcnt-1]addtoeqtoks{_bgroup}fi%
if]myeqnsep[numexprxcnt-1]addtoeqtoks{egroup}fi%
fi%
expandafteraddtoeqtoksexpandafter{x}%
}%
theeqtoks%
}
begin{document}
[
translate{a[1]+a[2]+b[c+d[3]] + x}
]
end{document}
answered 15 hours ago
Steven B. SegletesSteven B. Segletes
159k9204413
159k9204413
add a comment |
add a comment |
Inasmuch as I love doing crazy things in TeX, do the replacements in Mathematica! This will save you a huge amount of pain. For instance,
expr = (a[1] + a[2])/Sqrt[a[3]]
expr /. {a[1] -> [Alpha], a[2] -> [Beta], a[3] -> [Gamma]} // TeXForm
gives frac{alpha +beta }{sqrt{gamma }}
with no need to tweak the output.
add a comment |
Inasmuch as I love doing crazy things in TeX, do the replacements in Mathematica! This will save you a huge amount of pain. For instance,
expr = (a[1] + a[2])/Sqrt[a[3]]
expr /. {a[1] -> [Alpha], a[2] -> [Beta], a[3] -> [Gamma]} // TeXForm
gives frac{alpha +beta }{sqrt{gamma }}
with no need to tweak the output.
add a comment |
Inasmuch as I love doing crazy things in TeX, do the replacements in Mathematica! This will save you a huge amount of pain. For instance,
expr = (a[1] + a[2])/Sqrt[a[3]]
expr /. {a[1] -> [Alpha], a[2] -> [Beta], a[3] -> [Gamma]} // TeXForm
gives frac{alpha +beta }{sqrt{gamma }}
with no need to tweak the output.
Inasmuch as I love doing crazy things in TeX, do the replacements in Mathematica! This will save you a huge amount of pain. For instance,
expr = (a[1] + a[2])/Sqrt[a[3]]
expr /. {a[1] -> [Alpha], a[2] -> [Beta], a[3] -> [Gamma]} // TeXForm
gives frac{alpha +beta }{sqrt{gamma }}
with no need to tweak the output.
answered 12 hours ago
Bruno Le FlochBruno Le Floch
34.2k5115211
34.2k5115211
add a comment |
add a comment |
Here's a solution. The command addreplacementrule{text-to-replace}{replacement-text}
specifies replacements to make. Then the command replace{some math}
does the replacements.
This would probably be better done with the l3regex package or really find and replace as many other people mentioned.
documentclass{article}
makeatletter
newtoksri@activechars
defaddreplacementrule#1#2{addreplacementrule@#1@nil{#2}}
defaddreplacementrule@#1#2@nil#3{%
ri@activecharsexpandafter{theri@activechars\#1}%
ri@maketransitions#2@nil{#1}{#3}%
}
defreplace#1{%
begingroup
def\##1{%
bgrouplccode`~=`##1lowercase{egroup
def~{ri@continue{##1}}%
}%
catcode`##1=active
}%
theri@activechars
scantokens{#1}%
endgroup
}
defri@maketransitions#1#2@nil#3#4{%
deftemp{#2}%
ifxtempempty
expandafterdefcsname ri@lookup@detokenize{#3#1}endcsname{#4}%
letnextrelax
else
expandafterdefcsname ri@lookup@detokenize{#3#1}endcsname{ri@continue{#3#1}}%
defnext{ri@maketransitions#2@nil{#3#1}{#4}}%
fi
next
}
defri@continue#1#2{%
@ifundefined{ri@lookup@detokenize{#1#2}}{%
detokenize{#1}#2%
}{%
csname ri@lookup@detokenize{#1#2}endcsname
}%
}
begin{document}
addreplacementrule{x[2]}{x_2}
addreplacementrule{x[3]}{x^2}
$x+1+x[2]+x[3]+x[1]$
replace{$x+1+x[2]+x[3]+x[1]$}
end{document}
add a comment |
Here's a solution. The command addreplacementrule{text-to-replace}{replacement-text}
specifies replacements to make. Then the command replace{some math}
does the replacements.
This would probably be better done with the l3regex package or really find and replace as many other people mentioned.
documentclass{article}
makeatletter
newtoksri@activechars
defaddreplacementrule#1#2{addreplacementrule@#1@nil{#2}}
defaddreplacementrule@#1#2@nil#3{%
ri@activecharsexpandafter{theri@activechars\#1}%
ri@maketransitions#2@nil{#1}{#3}%
}
defreplace#1{%
begingroup
def\##1{%
bgrouplccode`~=`##1lowercase{egroup
def~{ri@continue{##1}}%
}%
catcode`##1=active
}%
theri@activechars
scantokens{#1}%
endgroup
}
defri@maketransitions#1#2@nil#3#4{%
deftemp{#2}%
ifxtempempty
expandafterdefcsname ri@lookup@detokenize{#3#1}endcsname{#4}%
letnextrelax
else
expandafterdefcsname ri@lookup@detokenize{#3#1}endcsname{ri@continue{#3#1}}%
defnext{ri@maketransitions#2@nil{#3#1}{#4}}%
fi
next
}
defri@continue#1#2{%
@ifundefined{ri@lookup@detokenize{#1#2}}{%
detokenize{#1}#2%
}{%
csname ri@lookup@detokenize{#1#2}endcsname
}%
}
begin{document}
addreplacementrule{x[2]}{x_2}
addreplacementrule{x[3]}{x^2}
$x+1+x[2]+x[3]+x[1]$
replace{$x+1+x[2]+x[3]+x[1]$}
end{document}
add a comment |
Here's a solution. The command addreplacementrule{text-to-replace}{replacement-text}
specifies replacements to make. Then the command replace{some math}
does the replacements.
This would probably be better done with the l3regex package or really find and replace as many other people mentioned.
documentclass{article}
makeatletter
newtoksri@activechars
defaddreplacementrule#1#2{addreplacementrule@#1@nil{#2}}
defaddreplacementrule@#1#2@nil#3{%
ri@activecharsexpandafter{theri@activechars\#1}%
ri@maketransitions#2@nil{#1}{#3}%
}
defreplace#1{%
begingroup
def\##1{%
bgrouplccode`~=`##1lowercase{egroup
def~{ri@continue{##1}}%
}%
catcode`##1=active
}%
theri@activechars
scantokens{#1}%
endgroup
}
defri@maketransitions#1#2@nil#3#4{%
deftemp{#2}%
ifxtempempty
expandafterdefcsname ri@lookup@detokenize{#3#1}endcsname{#4}%
letnextrelax
else
expandafterdefcsname ri@lookup@detokenize{#3#1}endcsname{ri@continue{#3#1}}%
defnext{ri@maketransitions#2@nil{#3#1}{#4}}%
fi
next
}
defri@continue#1#2{%
@ifundefined{ri@lookup@detokenize{#1#2}}{%
detokenize{#1}#2%
}{%
csname ri@lookup@detokenize{#1#2}endcsname
}%
}
begin{document}
addreplacementrule{x[2]}{x_2}
addreplacementrule{x[3]}{x^2}
$x+1+x[2]+x[3]+x[1]$
replace{$x+1+x[2]+x[3]+x[1]$}
end{document}
Here's a solution. The command addreplacementrule{text-to-replace}{replacement-text}
specifies replacements to make. Then the command replace{some math}
does the replacements.
This would probably be better done with the l3regex package or really find and replace as many other people mentioned.
documentclass{article}
makeatletter
newtoksri@activechars
defaddreplacementrule#1#2{addreplacementrule@#1@nil{#2}}
defaddreplacementrule@#1#2@nil#3{%
ri@activecharsexpandafter{theri@activechars\#1}%
ri@maketransitions#2@nil{#1}{#3}%
}
defreplace#1{%
begingroup
def\##1{%
bgrouplccode`~=`##1lowercase{egroup
def~{ri@continue{##1}}%
}%
catcode`##1=active
}%
theri@activechars
scantokens{#1}%
endgroup
}
defri@maketransitions#1#2@nil#3#4{%
deftemp{#2}%
ifxtempempty
expandafterdefcsname ri@lookup@detokenize{#3#1}endcsname{#4}%
letnextrelax
else
expandafterdefcsname ri@lookup@detokenize{#3#1}endcsname{ri@continue{#3#1}}%
defnext{ri@maketransitions#2@nil{#3#1}{#4}}%
fi
next
}
defri@continue#1#2{%
@ifundefined{ri@lookup@detokenize{#1#2}}{%
detokenize{#1}#2%
}{%
csname ri@lookup@detokenize{#1#2}endcsname
}%
}
begin{document}
addreplacementrule{x[2]}{x_2}
addreplacementrule{x[3]}{x^2}
$x+1+x[2]+x[3]+x[1]$
replace{$x+1+x[2]+x[3]+x[1]$}
end{document}
edited 14 hours ago
answered 14 hours ago
Hood ChathamHood Chatham
4,3541428
4,3541428
add a comment |
add a comment |
For the sake of variety, here's a LuaLaTeX-based solution. It sets up a Lua function, called trans
, which does most of the work with the help of Lua's versatile string-handling routines. The LaTeX macro trans
is a wrapper that invokes the Lua function.
documentclass{article}
usepackage{luacode} % for "luacode" environment and "luastringN" macro
begin{luacode}
function makesubscr ( s )
s = s:gsub ( "(%b)", function(x)
return ( "_{" .. string.sub ( x , 2 , -2 ) .. "}" )
end )
if s:find ( "%b" ) then
s = makesubscr ( s )
end
return s
end
function trans ( s )
s = makesubscr ( s )
s = s:gsub ( "a" , "\alpha" )
s = s:gsub ( "b" , "\beta" )
tex.sprint ( s )
end
end{luacode}
%% TeX-side code
newcommandtrans[1]{directlua{trans(luastringN{#1})}}
begin{document}
$trans{x[1]+x[2]^2+a+a[3]}$
$trans{a[1]+a[2]+b[c+d[3]]+x}$
end{document}
add a comment |
For the sake of variety, here's a LuaLaTeX-based solution. It sets up a Lua function, called trans
, which does most of the work with the help of Lua's versatile string-handling routines. The LaTeX macro trans
is a wrapper that invokes the Lua function.
documentclass{article}
usepackage{luacode} % for "luacode" environment and "luastringN" macro
begin{luacode}
function makesubscr ( s )
s = s:gsub ( "(%b)", function(x)
return ( "_{" .. string.sub ( x , 2 , -2 ) .. "}" )
end )
if s:find ( "%b" ) then
s = makesubscr ( s )
end
return s
end
function trans ( s )
s = makesubscr ( s )
s = s:gsub ( "a" , "\alpha" )
s = s:gsub ( "b" , "\beta" )
tex.sprint ( s )
end
end{luacode}
%% TeX-side code
newcommandtrans[1]{directlua{trans(luastringN{#1})}}
begin{document}
$trans{x[1]+x[2]^2+a+a[3]}$
$trans{a[1]+a[2]+b[c+d[3]]+x}$
end{document}
add a comment |
For the sake of variety, here's a LuaLaTeX-based solution. It sets up a Lua function, called trans
, which does most of the work with the help of Lua's versatile string-handling routines. The LaTeX macro trans
is a wrapper that invokes the Lua function.
documentclass{article}
usepackage{luacode} % for "luacode" environment and "luastringN" macro
begin{luacode}
function makesubscr ( s )
s = s:gsub ( "(%b)", function(x)
return ( "_{" .. string.sub ( x , 2 , -2 ) .. "}" )
end )
if s:find ( "%b" ) then
s = makesubscr ( s )
end
return s
end
function trans ( s )
s = makesubscr ( s )
s = s:gsub ( "a" , "\alpha" )
s = s:gsub ( "b" , "\beta" )
tex.sprint ( s )
end
end{luacode}
%% TeX-side code
newcommandtrans[1]{directlua{trans(luastringN{#1})}}
begin{document}
$trans{x[1]+x[2]^2+a+a[3]}$
$trans{a[1]+a[2]+b[c+d[3]]+x}$
end{document}
For the sake of variety, here's a LuaLaTeX-based solution. It sets up a Lua function, called trans
, which does most of the work with the help of Lua's versatile string-handling routines. The LaTeX macro trans
is a wrapper that invokes the Lua function.
documentclass{article}
usepackage{luacode} % for "luacode" environment and "luastringN" macro
begin{luacode}
function makesubscr ( s )
s = s:gsub ( "(%b)", function(x)
return ( "_{" .. string.sub ( x , 2 , -2 ) .. "}" )
end )
if s:find ( "%b" ) then
s = makesubscr ( s )
end
return s
end
function trans ( s )
s = makesubscr ( s )
s = s:gsub ( "a" , "\alpha" )
s = s:gsub ( "b" , "\beta" )
tex.sprint ( s )
end
end{luacode}
%% TeX-side code
newcommandtrans[1]{directlua{trans(luastringN{#1})}}
begin{document}
$trans{x[1]+x[2]^2+a+a[3]}$
$trans{a[1]+a[2]+b[c+d[3]]+x}$
end{document}
answered 33 mins ago
MicoMico
284k31388778
284k31388778
add a comment |
add a comment |
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%2f481546%2fhow-can-i-replace-every-global-instance-of-x2-with-x-2%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
Sort of sounds like translating math equations from one syntax to another, which reminded me of my very strange answer here: tex.stackexchange.com/questions/332012/…. Not that it will help you in the present case, without significant rework.
– Steven B. Segletes
15 hours ago
1
Do you absolutely need to convert as you typeset, or can you convert your source? If the latter, do you think it would be possible to unambiguously define all the situations in which this syntax would occur?
– Chris H
15 hours ago
@ChrisH that's exactly what I'm hoping for. I'm copying some parts of equations from Mathematica, and is written in terms of coefficients like
x[2]
for example, where I avoided subscripts in my code. I now want to save myself effort and simply definex[2] = x_2
in Latex, since it'll only ever occur within an equation.– Brad
15 hours ago
@StevenB.Segletes thank you for your post - Remarkably strange answer for that question, but I'll bear it in mind! I'm sure there must be a simpler way.
– Brad
15 hours ago
2
My editor of choice supports regex find/replace so I'd simply find
x[([0-9])]
and replace withx_$1
(on a copy of course)– Chris H
15 hours ago