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