mtx-synctex.lua question
Hi, In mtx-synctex.lua, inside local function findlocation(filename,page,xpos,ypos,tolerance) there is the following code: for s=1,tolerance,max(tolerance//10,1) do locate( s, 0) if fi ~= 0 then tl = s ; goto done end locate(-s, 0) if fi ~= 0 then tl = s ; goto done end locate( s, s) if fi ~= 0 then tl = s ; goto done end locate( s,-s) if fi ~= 0 then tl = s ; goto done end locate(-s, s) if fi ~= 0 then tl = s ; goto done end locate(-s,-s) if fi ~= 0 then tl = s ; goto done end end Is the omission of the locate(0, s) ... and locate(0, -s) ... cases intentional, or is that an oversight? If intentional, can someone explain the rationale to me? Thanks. Jim
On 12/7/2023 7:23 PM, Jim wrote:
Hi,
In mtx-synctex.lua, inside local function findlocation(filename,page,xpos,ypos,tolerance) there is the following code: for s=1,tolerance,max(tolerance//10,1) do locate( s, 0) if fi ~= 0 then tl = s ; goto done end locate(-s, 0) if fi ~= 0 then tl = s ; goto done end locate( s, s) if fi ~= 0 then tl = s ; goto done end locate( s,-s) if fi ~= 0 then tl = s ; goto done end locate(-s, s) if fi ~= 0 then tl = s ; goto done end locate(-s,-s) if fi ~= 0 then tl = s ; goto done end end
Is the omission of the locate(0, s) ... and locate(0, -s) ... cases intentional, or is that an oversight?
If intentional, can someone explain the rationale to me? it's too long ago to remember the reason ... did you test with and without?
Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
Hi Hans, On Fri, Dec 8, 2023 at 15:03 (+0100), Hans Hagen wrote:
On 12/7/2023 7:23 PM, Jim wrote:
Hi,
In mtx-synctex.lua, inside local function findlocation(filename,page,xpos,ypos,tolerance) there is the following code: for s=1,tolerance,max(tolerance//10,1) do locate( s, 0) if fi ~= 0 then tl = s ; goto done end locate(-s, 0) if fi ~= 0 then tl = s ; goto done end locate( s, s) if fi ~= 0 then tl = s ; goto done end locate( s,-s) if fi ~= 0 then tl = s ; goto done end locate(-s, s) if fi ~= 0 then tl = s ; goto done end locate(-s,-s) if fi ~= 0 then tl = s ; goto done end end
Is the omission of the locate(0, s) ... and locate(0, -s) ... cases intentional, or is that an oversight?
If intentional, can someone explain the rationale to me?
it's too long ago to remember the reason ... did you test with and without?
I did not. Yet. But on your suggestion, I will give it a try and get back to you. Jim
Hi Hans (and anyone else interested in synctex), On Fri, Dec 8, 2023 at 11:38 (-0400), Jim wrote:
Hi Hans,
On Fri, Dec 8, 2023 at 15:03 (+0100), Hans Hagen wrote:
On 12/7/2023 7:23 PM, Jim wrote:
Hi,
In mtx-synctex.lua, inside local function findlocation(filename,page,xpos,ypos,tolerance) there is the following code: for s=1,tolerance,max(tolerance//10,1) do locate( s, 0) if fi ~= 0 then tl = s ; goto done end locate(-s, 0) if fi ~= 0 then tl = s ; goto done end locate( s, s) if fi ~= 0 then tl = s ; goto done end locate( s,-s) if fi ~= 0 then tl = s ; goto done end locate(-s, s) if fi ~= 0 then tl = s ; goto done end locate(-s,-s) if fi ~= 0 then tl = s ; goto done end end
Is the omission of the locate(0, s) ... and locate(0, -s) ... cases intentional, or is that an oversight?
If intentional, can someone explain the rationale to me?
it's too long ago to remember the reason ... did you test with and without?
I did not. Yet.
But on your suggestion, I will give it a try and get back to you.
I modified mtx-synctex.lua as follows: % diff /usr/local/context/tex/texmf-context/scripts/context/lua/mtx-synctex.lua mtx-synctex-jd.lua 279a280
-- JD added (0, +/-s) cases for testing
282a284,285
locate( 0, s) if fi ~= 0 then tl = s ; goto done end locate( 0,-s) if fi ~= 0 then tl = s ; goto done end
and then wrote the following quick and dirty shell script to create log files for comparison: --------------------------------------------------------------------- #! /bin/zsh # File: compare-my-synctex-version # Author: Jim Diamond # Created: 2023/12/08 13:27:23 # # Purpose: Run some tests to compare ConTeXt's mtx-synctex-lua to # my own version, vis-a-vis the backward-search # functionality. # # Notes: Assumes $1 is a valid ConTeXt synctex file, # $2 is a valid page within that file, and # $3, if present, is a valid DEFAULT_TOLERANCE=300 if [[ $# < 2 || $# > 3 || ! -r $1 ]] then echo >&2 "Usage: $0 <synctex file> <page> [tolerance]" echo >&2 " tolerance default is $DEFAULT_TOLERANCE." exit 1 fi st_file=$1 page=$2 if [[ $3 != "" ]] then tolerance=$3 else tolerance=$DEFAULT_TOLERANCE fi x_vals=`seq 100 50 550` y_vals=`seq 100 50 700` old_results=${st_file}_page_${page}_tol_${tolerance}_using_current.out new_results=${st_file}_page_${page}_tol_${tolerance}_using_new.out if [[ -e $old_results || -e $new_results ]] then printf >&2 "$0: at least one of\n\t%s\nor\n\t%s\nexists; quitting.\n" \ $old_results $new_results exit 1 fi # Get rid of the extra newline from mtxrun as done below. for x in $=x_vals do for y in $=y_vals do printf "%3d, %3d: " $x $y out=`mtxrun --script synctex --goto --direct \ --page=$page --x=$x --y=$y --tolerance=$tolerance $st_file` echo $out done done | tee $old_results echo for x in $=x_vals do for y in $=y_vals do printf "%3d, %3d: " $x $y out=`mtxrun --script mtx-synctex-jd.lua --goto --direct \ --page=$page --x=$x --y=$y --tolerance=$tolerance $st_file` echo $out done done | tee $new_results --------------------------------------------------------------------- and ran it on one page of one synctex file for a few different values of tolerance (300, 200, 100 and 50). To briefly summarize, the modified script found a small number of matches that the original script didn't, occasionally the line number was different (almost always by 1, but a few times more), and the tolerance returned by this test version was also <= the tolerance returned by the current version. Admittedly, with the other two directions added in, a more extensive test (a total of a bit under 14 minutes CPU time on a Ryzen 4700U) showed the new version is about 0.5% slower, so there is a very minor downside. (I'd happily spend the extra matches for the minuscule amount of CPU time, but others may not.) Cheers. Jim
On 12/8/2023 7:51 PM, Jim wrote:
Hi Hans (and anyone else interested in synctex), 282a284,285
locate( 0, s) if fi ~= 0 then tl = s ; goto done end locate( 0,-s) if fi ~= 0 then tl = s ; goto done end
and then wrote the following quick and dirty shell script to create log files for comparison:
Admittedly, with the other two directions added in, a more extensive test (a total of a bit under 14 minutes CPU time on a Ryzen 4700U) showed the new version is about 0.5% slower, so there is a very minor downside. (I'd happily spend the extra matches for the minuscule amount of CPU time, but others may not.)
ok the .5% precen tis no big deal, also because this script is not that time critical (the code could be made a bit faster anyway) so i'll add the few lines so those 14 minutes, was that N times a file or 1 time a huge file? Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
On Fri, Dec 8, 2023 at 21:18 (+0100), Hans Hagen wrote:
On 12/8/2023 7:51 PM, Jim wrote:
Hi Hans (and anyone else interested in synctex), 282a284,285
locate( 0, s) if fi ~= 0 then tl = s ; goto done end locate( 0,-s) if fi ~= 0 then tl = s ; goto done end
and then wrote the following quick and dirty shell script to create log files for comparison:
ok
Admittedly, with the other two directions added in, a more extensive test (a total of a bit under 14 minutes CPU time on a Ryzen 4700U) showed the new version is about 0.5% slower, so there is a very minor downside. (I'd happily spend the extra matches for the minuscule amount of CPU time, but others may not.) the .5% precen tis no big deal, also because this script is not that time critical (the code could be made a bit faster anyway) so i'll add the few lines
Great. If nothing else, it will keep other people from asking the same question in the future. :-)
so those 14 minutes, was that N times a file or 1 time a huge file?
N times a file: I swiped the code from the program and defined two functions, one (test_old) one for the current code and one for the new code: test_new () { for x in $=x_vals do for y in $=y_vals do printf "%3d, %3d: " $x $y out=`mtxrun --script mtx-synctex-jd.lua --goto --direct \ --page=$page --x=$x --y=$y --tolerance=$tolerance $st_file` echo $out done done } (The test_old was the same except for the argument to --script, which is 'synctext'.) I defined $page=15, $tolerance=300 and $st_file to be a file with 3441 lines (there are 19 pages in total, so I was skipping a lot of stuff) and changed x_vals and y_vals to create a lot of iterations: x_vals=`seq 100 5 550` y_vals=`seq 100 5 700` and finally I ran time (test_new > /dev/null) and time (test_old > /dev/null) So mtxrun was called for each of these 11,011 times. Not the best possible benchmark, but probably good enough to show that adding the other two cases isn't hurtful. Cheers. Jim
participants (3)
-
Hans Hagen
-
Hans Hagen
-
Jim