0

In the current version of my book I use static referencing but now I want to use dynamic referencing using \label and \ref and performing the appropriate substitutions. Some substitution examples are the following:

Figure 5-6 -----> Figure \ref{0506}
Figure 2-17 ----> Figure \ref{0217}
Figure 14-4 ----> Figure \ref{1404}
Figure 34-45 --> Figure \ref{3445}
Figure 12-109 ---> Figure \ref{12109}

Since there are about 2000 such cases I want a regular expression for this (preferably in WinEdt). I was not able to construct such an expression. Can anyone help me with this? Thanks a lot!

4
  • 1
    What have you tried? What's the issue here? From your sample it would seem to be best to add a leading zero to entries with single digits on either side of the dash (using regular expressions, of course). Once you have that (i.e. Figure 05-06 and Figure 02-17 etc.) you simply search for a regex like Figure ([0-9]+)-([0-9]*) and replace with Figure \\ref{\1\2} or similar – unless WinEdt uses a different syntax, I am not familiar with that program.
    – Ingmar
    Feb 27 at 20:22
  • I tried to create a regular expression in which the first digit is optional in order to cover both cases but it did not worked correctly. I will try the leading zero approach, hoping to work. Thanks a lot !! Feb 27 at 20:57
  • It's a bit more difficult, since you'd have to have an optional zero in your replacement part. It took me three search & replaces to account for all your examples.
    – Ingmar
    Feb 27 at 21:10
  • 1
    while it may make this regex replace easier note that it is normally bad style to use the figure numbers as the \label reference. \ref{3445} will still work if the document is edited and that figure becomes Figure 35-22, but it will be very confusing for any human reading the source. Feb 27 at 21:34

2 Answers 2

2

I would do this in three stages, I'll use sed syntax but regex are more or less portable across systems.

  1. pad the single digit cases with zero (first part)

     $ echo 'Figure 5-6' | sed -e 's/Figure \([0-9]\)-/Figure 0\1-/'
     Figure 05-6
    
  2. pad the single digit cases with zero (second part)

     $ echo 'Figure 05-6 ' | sed -e 's/Figure \([0-9]\+\)-\([0-9][^0-9]\)/Figure \1-0\2/'
     Figure 05-06 
    
  3. Then convert to \ref

    $ echo 'Figure 05-06 ' | sed -e 's/Figure \([0-9]\+\)-\([0-9]\+\)/Figure \\ref{\1\2}/'
     Figure \ref{0506} 
    
0
0

@David Carlisle I did the same thing in Winedt (back references \1, \2, etc)

Case 1 ---> Figure \(1[0-9]\)-\(2[0-9]\)~[0-9]   e.g. 2-4.  ===> Figure 0\1-0\2     and then  Figure \\ref\{0\10\2\}       
Case 2 ---> Figure \(1[0-9]\)-\(2[0-9][0-9]\)~[0-9]   e.g. 2-14.  ===> Figure 0\1-\2      and then  Figure \\ref\{0\1\2\}         
Case 3 ---> Figure \(1[0-9][0-9]\)-\(2[0-9]\)~[0-9]   e.g. 12-4.  ===> Figure \1-0\2      and then  Figure \\ref\{\10\2\}         
Case 4 ---> Figure \(1[0-9][0-9]\)-\(2[0-9][0-9]\)~[0-9]   e.g. 12-14.   ===> Figure \1-\2       and then  Figure \\ref\{\1\2\}

(of course in the fourth case the middle step is not necessary).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.