On Jun 3, 2010, at 11:58 AM, Nobumi Iyanaga wrote:
> On Jun 1, 2010, at 8:00 PM, Kino wrote:
>
>> Surely there would be other ways to do so but my usual procedure is
>>
>> $variable = Cast to String 'something' # unnecessary if 'something' is already plain text
>> Push Target Text $variable
>> Set Font Name 'Hiragino Mincho Pro'
>> Pop Target Text
>
> Ah, I didn't know these commands. I read the explanation in Nisus Macro Reference, but I don't understand well what is the point. Could you give me a more detailed explanation on these commands...?
But what details? All I know is that it allows you to apply some attributes on a variable (text object). Isn't it handy?
> On the other hand, I found that if I just insert the text, after setting the font to a certain font at the insertion point, it is not only the inserted text but some other characters are changed to that font...
Then, that would not be a good idea. I have never experienced an oddity of that kind when running macros using the procedure above-quoted such as the one below.
> Another oddity was that if I use "Set Font Name 'Hiragino Mincho Pro'" command, the font changes to Hiragino Mincho Pro, but the character is marked as "Font Substituted" (highlighted in Red); this does not happen if I use the menu command "Format:Font:Hiragino Mincho Pro".
I have never experienced it either. Perhaps did you insert a Japanese string somewhere in a text portion in another language? Then, you need to apply the Japanese language on the string to be inserted, I guess. This depends on how you have configured Preferences - Languages, though.
> Anyway, I found that the menu commands are not specially slow, and work well.
>
> Another thing (unrelated to this subject) that I found in writing this macro is that the command "$text.find xxx"... is VERY VERY slow. I could replace them with "$text.rangeOfString xxx" -- but this should really be improved, like perl's "$text =~ /xxx/"... command.
Really? How did you test it? For me, find command seems to be 2 or 3 times slower but is it fair to call it "VERY VERY slow" for that? It is much more featured and it would not be a good idea to use it when rangeOfString is sufficient. I don't know what perl's equivalent of rangeOfString is but, as to s///, sed is much faster than perl and perl's tr/// is much faster than its s///. However, I don't think you will blame perl for that.
Kino
--
### Styles2LaTeX ###
# Mixed style attributes, e.g. "Bold Italic", "Bold and SmallCaps", are not supported.
$tagFont = 'Courier'
$tagSize = 9
$tagColor = Color.newWithHexTriplet 0x009933
$tags = $prop = $vals = Hash.new
$styles = Array.new ('it', 'bf', 'sc')
$tags{'it'} = '\textit{'
$prop{'it'} = 'italic'
$vals{'it'} = true
$tags{'bf'} = '\textbf{'
$prop{'bf'} = 'bold'
$vals{'bf'} = true
$tags{'sc'} = '\textsc{'
$prop{'sc'} = 'characterCase'
$vals{'sc'} = 3
$tags{'it.closing'} = $tags{'bf.closing'} = $tags{'sc.closing'} = '}'
Require Pro Version 1.3
$doc = Document.active
if $doc == undefined
exit
end
foreach $key, $value in $tags
$value = Cast to String $value
Push Target Text $value
Set Font Name $tagFont
Set Font Size $tagSize
Set Text Color $tagColor
Pop Target Text
$tags.setValueForKey $value, $key
end
$sels = Hash.new
$text = $doc.text
$i = 0
while $i < $text.length
$attr = $text.displayAttributesAtIndex $i
$range = $text.rangeOfDisplayAttributesAtIndex $i
foreach $style in $styles
if $attr.getProperty($prop{$style}) == $vals{$style}
if $sels{$style} == undefined
$sels{$style} = Array.new
end
$sel = TextSelection.new $text, $range
$sels{$style}.appendValue $sel
end
end
$i = $range.bound
end
foreach $key in $sels.keys
foreach $i, $sel in reversed $sels{$key}
if ! $i
break
elsif $sels{$key}[$i-1].text.isSameObject($sel.text)
if $sels{$key}[$i-1].bound == $sel.location
$sels{$key}[$i-1].length += $sel.length
$sels{$key}.removeValueAtIndex $i
end
end
end
end
$selToStyle = Hash.new
foreach $key in $sels.keys
if $sels{$key}.count
foreach $sel in $sels{$key}
$selToStyle{$sel} = $key
end
end
end
$allSels = $selToStyle.keys
$allSels.sort
foreach $sel in reversed $allSels
$style = $selToStyle{$sel}
$sel.text.insertAtIndex $sel.bound, $tags{"$style.closing"}
$sel.text.insertAtIndex $sel.location, $tags{$style}
end
### end of macro ###
|