$ErrorActionPreference = 'Stop' $root = "c:\Users\fdavalos\OneDrive - up.edu.mx\microtracking\MicrotrackingFer" function BE16($b, $o) { ($b[$o] -shl 8) + $b[$o+1] } function BE32($b, $o) { ($b[$o] -shl 24) + ($b[$o+1] -shl 16) + ($b[$o+2] -shl 8) + $b[$o+3] } function Get-NameTable($path) { $bytes = [IO.File]::ReadAllBytes($path) $out = [PSCustomObject]@{ File = (Split-Path $path -Leaf); Size = $bytes.Length; NumTables='?'; NameOff='?'; Count='?'; FirstRecords='?'; Family='?'; Subfamily='?'; TyposFamily='?'; TyposSubfamily='?' } if ($bytes.Length -lt 16) { $out.NumTables = 'toosmall'; return $out } $num = BE16 $bytes 4 $out.NumTables = $num $off = 12 $nameOff = -1 if ($num -gt 64) { $num = 64 } for ($i=0; $i -lt $num; $i++) { if ([Text.Encoding]::ASCII.GetString($bytes, $off, 4) -eq 'name') { $nameOff = BE32 $bytes ($off+8) } $off += 16 } $out.NameOff = $nameOff if ($nameOff -lt 0) { $out.Count = 'none'; return $out } $count = BE16 $bytes ($nameOff+2) $strOff = BE16 $bytes ($nameOff+4) $base = $nameOff + $strOff $out.Count = $count $res = @{} $roff = $nameOff + 6 $shown = @() for ($i=0; $i -lt $count; $i++) { if ($roff + 12 -gt $bytes.Length) { break } $pid_ = BE16 $bytes $roff $eid = BE16 $bytes ($roff+2) $lid = BE16 $bytes ($roff+4) $nid = BE16 $bytes ($roff+6) $len = BE16 $bytes ($roff+8) $soff = BE16 $bytes ($roff+10) if ($i -lt 10) { $shown += ("p=$pid_ e=$eid l=$lid n=$nid len=$len off=$soff") } if ($pid_ -eq 3 -and $lid -eq 0x0409 -and $len -gt 0 -and ($base+$soff+$len) -le $bytes.Length) { $s = [Text.Encoding]::Unicode.GetString($bytes, $base+$soff, $len) $key = switch ($nid) { 1 {'Family'} 2 {'Subfamily'} 16 {'TyposFamily'} 17 {'TyposSubfamily'} default { $null } } if ($key -and -not $res.ContainsKey($key)) { $res[$key] = $s } } $roff += 12 } $out.FirstRecords = ($shown -join ' | ') foreach ($k in $res.Keys) { if ($out.$k -eq '?') { $out.$k = $res[$k] } } $out } $otfDir = "$root\tools\fonts\lm\fonts\opentype\public\lm" Write-Output '=== [1] debug: key OTFs (raw first records + parsed names) ===' @('lmroman10-regular.otf','lmroman10-italic.otf','lmmath.otf') | ForEach-Object { $p = Join-Path $otfDir $_ if (Test-Path $p) { Get-NameTable $p | Format-List | Out-String -Width 200 | Write-Output } else { Write-Output ("{0} : NOT PRESENT" -f $_) } } Write-Output '=== [2] families across all local OTFs ===' Get-ChildItem $otfDir -Filter *.otf | ForEach-Object { $r = Get-NameTable $_.FullName "{0} / {1}" -f $r.Family, $r.Subfamily } | Group-Object | Sort-Object Name | ForEach-Object { "{0} (x$($_.Count))" -f $_.Name } Write-Output '' Write-Output '=== [3] elsarticle/times .cls/.sty present in repo? ===' Get-ChildItem $root -Include *.cls,*.sty -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.Name -match 'elsarticle|times' } | Select-Object -ExpandProperty FullName Write-Output '' Write-Output '=== [4] bundle top structure (depth 3) ===' Get-ChildItem (Join-Path $root 'tools\tectonic-src\bundle') -Depth 3 -ErrorAction SilentlyContinue | Select-Object @{n='Rel';e={$_.FullName.Substring($root.Length+1)}}, PSIsContainer, Length | Select-Object -First 45 Rel, PSIsContainer, Length | Format-Table -AutoSize | Out-String -Width 170 | Write-Output